1

我在这里有一种情况。我有一个“索引超出范围”错误,我不知道是什么原因造成的。我想这与标签有关。

通常,标签代表一个数字。如果我将该数字除以列数,它会返回我单击的按钮所在的行。如果我采用该标签的模式,它应该返回我单击按钮的列。但是出了点问题,我不知道是什么。我希望有人可以帮助我解决这个问题。提前致谢。

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
4

1 回答 1

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

使用 Tag 属性是一种非常糟糕的做法。只是这一个语句片段有 3 个错误:

  • 它随机索引错误rij,因为它使用浮点除法,然后需要四舍五入以创建数组的索引。需要整数除法,\运算符

  • 它使用了完全错误的 Tag 属性,即表单而不是按钮之一

  • -2 调整的原因很难弄清楚,但肯定会产生负值。这就是产生异常的原因。

避免这类错误需要完全不同的编程风格。当您将Option Strict On其放在文件顶部并修复您现在将获得的所有错误消息时,您将获得一个。请注意,您会得到很多,需要一段时间才能对其进行排序。

并停止使用 Tag 属性。正确的面向对象方法是从 Button 派生您自己的类并添加一个rijandkolom属性。这样你永远不会弄错。

于 2013-11-12T22:00:52.470 回答