Для цикла с Datagridview1.selectedRows().cells().значение имеет ‘Индекс был вне диапазона.’ [vb.net ]

#vb.net #datagridview #vb.net-2010

#vb.net #datagridview #vb.net-2010

Вопрос:

Мои значения в Datagridview являются

 |   warranty  |
---------------
|    0001     |
|    0002     |
|    0003     |
|    0004     |
  

значения из кода :

 Private Sub UpdateGrid()

    Dim str As String = "select Warranty from TBwarranty"

    ds = New DataSet
    da = New OleDbDataAdapter(str, connection)
    da.Fill(ds, "a")

    DataGridView1.DataSource = ds.Tables("a")

End Sub
  

Пожалуйста, может кто-нибудь действительно сказать мне, что не так с этим кодом, из-за которого у меня возникает эта ошибка:

System.ArgumentOutOfRangeException: ‘Индекс был вне диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс’

Сначала я кодировал:

  Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    Dim c As Integer = DataGridView1.SelectedRows.Count() - 1 

    For i As Integer = 0 To c

        Dim deleteQuery As String = "DELETE from TBwarranty WHERE warranty='" amp; DataGridView1.SelectedRows(i).Cells(0).Value amp; "'"

        Try
            T.ExecuteQuery(deleteQuery, connection) 'This my public sub in other class [ command.ExecuteNonQuery() ]
            UpdateGrid()
        Catch ex As System.Data.OleDb.OleDbException
            MsgBox(ex.Message)
            MessageBox.Show("Fail inserted.")
        End Try

    Next

End Sub
  

Затем возникла проблема с ошибкой выше.

Затем я попробовал кодирование:

     Dim c As Integer = DataGridView1.SelectedRows.Count() - 1 

    For i As Integer = 0 To c

        Dim deleteQuery As String = "DELETE from TBwarranty WHERE warranty='" amp; DataGridView1.SelectedRows(i).Cells(0).Value amp; "'"
        Console.WriteLine(deleteQuery)

    Next
  

В нем нет никакой ошибки, и выводимое в консоль значение является истинным.

Я не понимаю, почему это? Что не так? и как мне это сделать? Спасибо за помощь.

Комментарии:

1. Вы изменили коллекцию строк, удалив строку во время итерации, что приводит к тому, что первоначально выбранные индексы становятся недействительными или выходят за пределы диапазона. Много способов сделать это. Одним из них, сохраните выбранные значения гарантии в списке. Затем только вы удаляете из базы данных на основе значений гарантии в списке.

2. @ajakblackgoat Я понял! Спасибо

Ответ №1:

По совету комментария. Теперь я могу устранить ошибку.

 Dim c As Integer = DataGridView1.SelectedRows.Count() - 1 

    For i As Integer = 0 To c
        Dim deleteQuery As String = "DELETE from TBwarranty WHERE warranty='" amp; DataGridView1.SelectedRows(i).Cells(0).Value amp; "'"

        Console.WriteLine(deleteQuery)

        Try
            T.ExecuteQuery(deleteQuery, connection) 
        Catch ex As System.Data.OleDb.OleDbException
            MsgBox(ex.Message)
            MessageBox.Show("Failed inserted.")
        End Try
    Next

    UpdateGrid()