Mo Nek Ответов: 2

Удаление строки datatable


У меня есть Datatable (dtP) , заполненный OledbDataAdapter(daP) из базы данных Access.
Текстовые поля в форме привязаны к dtP
У меня есть 4 кнопки,которые позволяют мне перемещаться по строкам (следующая,предыдущая, первая и последняя), а также кнопки для обновления изменений в строке и еще одна кнопка для удаления строки.
Все работает нормально, я могу добавлять строки, изменять данные в строке, но я не могу удалить строку.
Кнопка Удалить которая вызывает следующее:
>>> CurrID << - это индексированный идентификатор текущей строки
 Private Sub bDel_Click(sender As Object, e As EventArgs) Handles bDel.Click
    For i As Integer = 0 To dtP.Rows.Count - 1
        Dim dr As DataRow = dtP.Rows(i)
        If dr("ID") = CurrID Then
            dr.Delete()
        End If
    Next
    dtP.AcceptChanges()
End Sub
приложение проходит без каких-либо ошибок,я поставил точку останова на dr.delete строка, чтобы убедиться, что она проходит через него, и это происходит, но строка не удаляется.
Я тоже пытался dr.remove вместо dr.delete это тоже не работает.

Есть идеи?

Спасибо

Что я уже пробовал:

Я тоже пробовал:
Private Sub bDel_Click(sender As Object, e As EventArgs) Handles bDel.Click
    For i As Integer = 0 To dtP.Rows.Count - 1
        Dim dr As DataRow = dtP.Rows(i)
        If dr("ID") = CurrID Then
            dr.remove()
        End If
    Next
    dtP.AcceptChanges()
End Sub

2 Ответов

Рейтинг:
1

Sandeep Mewara

Попробуйте идти в обратном порядке, ища строку для удаления, чтобы избежать пропуска строки после удаления текущего индекса.

For i As Integer = dtP.Rows.Count - 1 To 0
Dim dr As DataRow = dtP.Rows(i)
    If dr("ID") = CurrID Then 
        dr.Delete()
    End If
Next

dtP.AcceptChanges()

Если вышеописанное не работает, попробуйте с помощью
dt.Rows.Remove(dr)
подход.


Посмотрим, сработает ли это!


Рейтинг:
0

OriginalGriff

Читать документацию: объект DataRow.Метод Удаления (System.Data) | Microsoft Docs[^]
Это довольно ясно о том, что происходит:

Цитата:
Если RowState строки добавляется, то RowState отсоединяется и строка удаляется из таблицы при вызове AcceptChanges.

Состояние строки удаляется после использования метода Delete для существующего потока данных. Он остается удаленным до тех пор, пока вы не вызовете AcceptChanges. В это время DataRow удаляется из таблицы.

Delete не должен вызываться в цикле foreach при итерации через объект DataRowCollection. Delete изменяет состояние коллекции.

Удаленные строки могут быть восстановлены в результате применения метода rejectchanges.

Обратите также внимание на кусок, который я выделил курсивом ...