我在这里遇到一种情况。我有一个“索引超出范围”的错误,我不知道是什么原因造成的。我想这与标签有关。
通常标签代表一个数字。如果我将该数字除以列数,它会返回我单击的按钮行。如果我采用该标签的mod,它应该返回单击按钮的列。但有些事情是错的,我无法弄清楚是什么。我希望有人可以帮助我解决这个问题。提前谢谢。
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 :(得分:1)
If myButtons(Tag / AANTAL_KOLOMMEN, (Tag Mod AANTAL_KOLOMMEN) - 2) ...
使用Tag属性是非常糟糕的做法。只有这一个语句片段有3个错误:
它随机索引错误的rij
,因为它使用浮点除法,然后需要对其进行舍入以生成数组的索引。需要整数除法,\
运算符
它使用完全错误的Tag属性,其中一个形式而不是按钮
-2调整的原因很难弄清楚,但肯定会产生负值。这就是产生异常的原因。
避免这些错误需要一种截然不同的编程风格。当您将Option Strict On
放在文件顶部并修复现在将获得的所有错误消息时,您将获得的那个。请注意,你会得到很多,它需要一段时间来排序。
并停止使用Tag属性。正确的面向对象方法是从Button派生自己的类,并添加rij
和kolom
属性。你永远不会错的。