请考虑以下代码:
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)
崩溃并显示以下错误:
指数超出范围。必须是非负的且小于大小 该系列。
答案 0 :(得分:1)
首先请注意,在VB.NET和C#中,FOR循环的实现方式不同!
在VB.NET中,它的工作原理如下:
BEFORE 循环启动后,您将确定循环的开始和结束:
然后,循环开始。
重要的是要知道,在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
然后您的代码将:
你需要扭转循环
For i As Integer = arr.Count - 1 To OrderListBox.SelectedIndex Step -1
arr.RemoveAt(i)
Next