#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()