【问题标题】:Strange error (index bound out of array vb.net)奇怪的错误(索引超出数组 vb.net)
【发布时间】:2015-09-20 20:21:11
【问题描述】:

我正在尝试创建一个包含 5 个元素的列表

   Dim clickcount As Integer = 0
   Dim clickindex(6) As Integer
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button5.Click, Button4.Click, Button6.Click
    Dim btn As Button
    btn = CType(sender, Button)

    If btn.BackColor = Color.Red Then
        btn.BackColor = Color.Green
        Dim strList As List(Of Integer) = clickindex.ToList()
        strList.Remove(btn.Tag)
        clickindex = strList.ToArray()
        clickcount -= 1
    ElseIf btn.BackColor = Color.Green Then
        If clickcount = 5 Then
            MsgBox("Max Reach")
            Exit Sub
        End If
        btn.BackColor = Color.Red
        clickcount += 1
        clickindex(clickcount) = btn.Tag

    End If

End Sub

每点击一个按钮,就会将按钮编号添加到列表中,最多点击5个按钮 当您再次单击按钮时,它将从数组中删除按钮编号。

我的问题是,当我点击几次时,出现错误,它说索引超出数组,但索引仍在范围内。 谁知道问题出在哪里?

【问题讨论】:

  • 这个逻辑有一些缺陷...btn.Tag 的值是多少?它会改变吗?
  • 我在 btn.tag 中设置了数字,例如 button1.tag =1 button2.tag =2 它是固定的
  • 有没有可能Clickcount在某个时候变成负数?
  • 不清楚您要做什么。您是否要计算每个按钮被点击了多少次?单击不同的红色按钮时发生崩溃:点击计数变为负数
  • 我正在创建一个停车场管理系统,一个按钮代表一个停车场,一个用户一次只能选择5个地方

标签: arrays vb.net list integer


【解决方案1】:

问题的根源:

你的问题在这里:

    Dim strList As List(Of Integer) = clickindex.ToList()
    strList.Remove(btn.Tag)
    clickindex = strList.ToArray()

看看下面的例子: 假设 clickindex 如下所示

 clickindex = {1,0,3,0,0,0,0} 'Dim clickindex(6) As Integer declares an array with length '7'

Dim strList As List(Of Integer) = clickindex.ToList() 之后,strList 现在是 List of Integer,包含 7 个项目:{1,0,3,0,0,0,0}

   strList.Remove(btn.Tag)
   'strList is nog a List of Integer with 6 Items (btn.Tag has been removed)
   clickIndex = lst.ToArray()
   'ClickIndex is now an Array with 6 items instead of the original 7

可能的解决方案

为什么不直接使用以下(更简单的)代码:

Dim clickindex As new List(Of Integer)
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button5.Click, Button4.Click, Button6.Click
    Dim btn As Button
    btn = CType(sender, Button)

    If btn.BackColor = Color.Red Then
        btn.BackColor = Color.Green
        strList.Remove(btn.Tag)
    ElseIf btn.BackColor = Color.Green Then
        If strList.Count >= 5 Then
            MsgBox("Max Reach")
            Exit Sub
        End If
        btn.BackColor = Color.Red
        strList.Add(btn.Tag)

    End If

End Sub

【讨论】:

    猜你喜欢
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多