在列表框VB.NET中索引超出范围

时间:2015-04-24 10:08:46

标签: vb.net

请考虑以下代码:

Private Sub DelButton_Click(sender As Object, e As EventArgs) Handles DelButton.Click

    If OrderListBox.Text = "" = False Then

        For i As Integer = OrderListBox.SelectedIndex To arr.Count - 1

            arr.RemoveAt(i)

        Next


        OrderListBox.Items.Remove(OrderListBox.SelectedItem)

    End If

    calculate()

End Sub

程序在arr.RemoveAt(i)崩溃并显示以下错误:

  

指数超出范围。必须是非负的且小于大小   该系列。

3 个答案:

答案 0 :(得分:1)

首先请注意,在VB.NET和C#中,FOR循环的实现方式不同!

在VB.NET中,它的工作原理如下:

BEFORE 循环启动后,您将确定循环的开始和结束:

  • Start = OrderListBox.SelectedIndex
  • 结束= arr.Count-1

然后,循环开始。

重要的是要知道,在VB.NET中,循环的结束不再被再次计算。这是C#的一个重要区别。在C#中,循环的结束是在每个循环之前计算的。

现在,在循环中,你是 DELETING 来自数组的记录 因此,数组中的记录数为减少。 但是,循环正在进行,因为您已经在循环开始之前计算了数组中的记录数。

因此,您将超出阵列的范围。

您可以按如下方式重写代码:

   Dim i as Integer
   i = OrderListBox.SelectedIndex
   while i < arr.Count
       arr.RemoveAt(i)
   Next

本文介绍了VB.NET中for循环的详细信息,特别是“技术实现”部分:https://msdn.microsoft.com/en-us/library/5z06z1kb.aspx

答案 1 :(得分:0)

当您尝试删除索引大于集合大小的项时,将抛出此错误。即当i大于arr.Count - 1时。

您应该确保OrderListBox.SelectedIndex不大于arr.Count - 1。因为如果确实如此,则删除一个不存在的项目。

此代码实际显示在MSDN docs中。如上所述,你应该这样做:

   Private Sub RemoveTopItems()
   ' Determine if the currently selected item in the ListBox  
   ' is the item displayed at the top in the ListBox. 
   If listBox1.TopIndex <> listBox1.SelectedIndex Then 
   ' Make the currently selected item the top item in the ListBox.
   listBox1.TopIndex = listBox1.SelectedIndex
   End If 
   ' Remove all items before the top item in the ListBox. 
   Dim x As Integer 
   For x = listBox1.SelectedIndex - 1 To 0 Step -1
      listBox1.Items.RemoveAt(x)
   Next x

   ' Clear all selections in the ListBox.
   listBox1.ClearSelected()
End Sub 'RemoveTopItems

答案 2 :(得分:-1)

如果没有选择任何项目,

ListBox.SelectedIndex将返回负值1(-1)。

您没有在代码中查看它。

将您的代码更改为:

If OrderListBox.SelectedIndex >= 0 And OrderListBox.Text = "" = False Then

修改

您的代码是:

 For i As Integer = OrderListBox.SelectedIndex To arr.Count - 1

        arr.RemoveAt(i)

 Next

假设您的OrderListBox包含3项:[A,B,C]且SelectedIndex为0

然后您的代码将:

  • 删除(0)===&gt; [B,C]
  • 删除(1)===&gt; [B]
  • 删除(2)===&gt;例外!

你需要扭转循环

 For i As Integer = arr.Count - 1 To OrderListBox.SelectedIndex Step -1

        arr.RemoveAt(i)

 Next