2015-04-24 2 views
-1

Рассмотрим следующий код:Индекс вне диапазона в ListBox 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) и выводит следующее сообщение об ошибке:

Index was out of range. Must be non-negative and less than the size of the collection.

+0

, что вы имеете в виду можете ли вы объясните больше пожалуйста @HenkHolterman –

ответ

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 
+0

еще одна проблема –

+0

Отметьте сейчас мое редактирование. – Eminem

-1

ListBox.SelectedIndex возвращает значение отрицательного (-1) возвращается, если не выбран ни один элемент.

Вы не указали это в своем коде.

Измените код следующим образом:

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

EDIT

Ваш код это:

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

     arr.RemoveAt(i) 

Next 

Допустим, ваш OrderListBox содержит 3 элемента: [A, B, C ] и SelectedIndex: 0

Тогда ваш код будет:

  • Remove (0) ===> [B, C]
  • Remove (1) ===> [B]
  • Remove (2) ===> Исключение!

Вы должны полностью изменить Петля

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

     arr.RemoveAt(i) 

Next 
+0

Я пробовал это, и он по-прежнему дает ту же ошибку –

+0

is arr size same with listbox size? –

+0

Да, что когда-либо добавлено в список массивов, добавляется в arr –

1

Прежде всего, обратите внимание, что в VB.NET и C#, для петель реализованы по-разному!

В VB.NET, он работает так:

ПЕРЕД цикл начинается, вы определения начала и конца цикла:

  • Start = OrderListBox.SelectedIndex
  • End = arr.Count-1

Затем начинается цикл.

Важно знать, что в VB.NET, конец цикла больше не вычисляется. Это важное отличие от C#. В C# конец цикла вычисляется до для каждой отдельной петли.

И теперь, в цикле, вы находитесь DELETING записей из массива.
Следовательно, количество записей в массиве DECREASING. Однако ваш цикл продолжается, поскольку вы вычислили количество записей в массиве до начала цикла.

Следовательно, вы выходите за пределы диапазона массива.

Вы можете переписать код следующим образом:

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

Эта статья содержит подробную информацию о для цикла в VB.NET, особенно в разделе «Техническая реализация»: https://msdn.microsoft.com/en-us/library/5z06z1kb.aspx

+0

@HenkHolterman Нет, вам НЕ нужно, потому что массив сжимается после каждой итерации цикла! –

+0

Вы правы, я читал это неправильно. –

Смежные вопросы