2013-11-12 3 views
1

Я здесь в какой-то ситуации. У меня ошибка «index is out of bounds», и я не знаю, что ее вызывает. Я предполагаю, что это имеет какое-то отношение к тегам.Ошибка VB.NET-индекса за пределами

Обычно тег представляет собой число. Если я делю это число на количество столбцов, он возвращает мне строку кнопки, которую я нажал. Если я возьму мод этого тега, он должен вернуть мне столбец нажатой кнопки. Но что-то не так, и я не могу понять, что. Надеюсь, кто-то может помочь мне в этом. Заранее спасибо.

Public Class Form1 
    Dim AANTAL_KOLOMMEN As Integer = 8 
    Dim AANTAL_RIJEN As Integer = 8 
    Dim Button1 As Button 
    Dim tel As Boolean 
    Dim value1 As Integer 
    Dim value2 As Integer 
    Dim myButtons(AANTAL_RIJEN, AANTAL_KOLOMMEN) As Button 



    Public Function zetNieuw(rij As Integer, kolom As Integer) As Button 
     Dim nieuweKnop As New Button() 
     nieuweKnop.Width = 40 
     Me.Controls.Add(nieuweKnop) 
     nieuweKnop.Name = "Btn_" & rij & "_" & kolom 
     nieuweKnop.Left = kolom * nieuweKnop.Width 
     nieuweKnop.Top = rij * nieuweKnop.Width 
     nieuweKnop.Height = nieuweKnop.Width 
     nieuweKnop.Text = "" 
     AddHandler nieuweKnop.MouseDown, AddressOf Klik 
     If rij = 3 And kolom = 3 Then 
      nieuweKnop.BackColor = Color.Black 
     End If 
     If rij = 4 And kolom = 4 Then 
      nieuweKnop.BackColor = Color.Black 
     End If 
     If rij = 3 And kolom = 4 Then 
      nieuweKnop.BackColor = Color.White 
     End If 
     If rij = 4 And kolom = 3 Then 
      nieuweKnop.BackColor = 
       Color.White 
     End If 
     nieuweKnop.Tag = (kolom + (rij * AANTAL_KOLOMMEN)) 
     Return nieuweKnop 


    End Function 


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     For Me.value2 = 0 To AANTAL_RIJEN - 1 Step 1 
      For Me.value1 = 0 To AANTAL_KOLOMMEN - 1 Step 1 

       myButtons(value2, value1) = Me.zetNieuw(value2, value1) 
      Next 
     Next 

    End Sub 
    Private Sub Klik(sender As Object, e As MouseEventArgs) 
     Dim knop As Button = sender 
     Dim value As String = knop.Tag 

     If myButtons(Tag/AANTAL_KOLOMMEN, (Tag Mod AANTAL_KOLOMMEN) - 2).BackColor = Color.Black Or myButtons((Tag/AANTAL_KOLOMMEN - 2), Tag Mod AANTAL_KOLOMMEN).BackColor = Color.Black Or myButtons((Tag/AANTAL_KOLOMMEN) - 2, (Tag Mod AANTAL_KOLOMMEN) - 2).BackColor = Color.Black Then 
      knop.BackColor = Color.Black 

     ElseIf myButtons(Tag/AANTAL_KOLOMMEN, (Tag Mod AANTAL_KOLOMMEN) - 2).BackColor = Color.White Or myButtons((Tag/AANTAL_KOLOMMEN - 2), Tag Mod AANTAL_KOLOMMEN).BackColor = Color.White Or myButtons((Tag/AANTAL_KOLOMMEN) - 2, (Tag Mod AANTAL_KOLOMMEN) - 2).BackColor = Color.White Then 
      knop.BackColor = Color.Black 
     End If 



    End Sub 




End Class 
+0

Эта ошибка в основном означает, что вы пытаетесь использовать индекс, который находится за пределами диапазона. Скажем, у вас есть 10 предметов в массиве, и вы просите элемент 13, он взорвется. Пройдите через код и проверьте, сколько у вас элементов и посмотрите, какой индекс вы вызываете. – logixologist

+1

Помните, что индексы массива в .Net начинаются с 0, а не 1. –

+0

Невозможно понять, что я делаю неправильно здесь. Вы уже потратили несколько часов на это и не можете найти его. – user2975965

ответ

1
If myButtons(Tag/AANTAL_KOLOMMEN, (Tag Mod AANTAL_KOLOMMEN) - 2) ... 

Используя свойство Tag является плохой практикой очень. Именно этот фрагмент один оператор имеет 3 ошибки:

  • он случайным образом индексы неправильно rij, потому что с помощью деление с плавающей точкой, которые затем должны быть закруглены, чтобы сделать индекс для массива. Целочисленное деление требуется, на \ оператор

  • Он использует совершенно неправильно свойство Tag, один из формы вместо кнопки

  • Причина -2 регулировки трудно сообразить, но, безусловно, генерировать отрицательные значения. Это то, что генерирует исключение.

Избегать подобных ошибок требует довольно принципиально иного стиля программирования. Тот, который вы приобретете, когда положите Option Strict On в начало файла и исправите все сообщения об ошибках, которые вы сейчас получите. Опасайтесь, что вы их получите много, это займет некоторое время, чтобы отсортировать его.

И прекратите использование свойства Tag. Правильный объектно-ориентированный способ - вывести свой собственный класс из Button и добавить свойство rij и kolom. Вы никогда не ошибетесь.

+0

Что можно использовать вместо свойства тега. В состояниях присваивания я могу использовать этот тег, чтобы найти кнопку. Но если я не могу использовать тег, что я могу использовать вместо этого? – user2975965

+2

Вы не дошли до последнего абзаца в ответе? –

+0

Не могли бы вы объяснить мне, как это сделать? – user2975965

Смежные вопросы