Как получить все строки ультрасетки, даже удаленные строки

Я хочу получить все ряды ультрасетки, даже удаленные строки. Я использовал следующий код, чтобы выбрать только один столбец этой сетки, но это вызвало ошибку:

"Информация об удаленной строке не может быть доступна через строку".

((DataTable)grid1.DataSource).AsEnumerable()
                             .Select(row => row.Field<String>("filedName"))
                             .ToList();

я использовал .AcceptChanges() чтобы решить эту ошибку, но теперь результат не содержит удаленных строк.

Может ли кто-нибудь помочь мне получить все строки, включая удаленные строки этой ультрасетки?

1 ответ

Решение

Невозможно напрямую связаться с DataRow после применения к нему метода Delete. Если вы вызовете AcceptChanges, то этот DataRow будет удален из коллекции, как будто ее там никогда не было. (И, таким образом, если вы еще не обновили базу данных, строка никогда не будет удалена из базы данных)

Чтобы полностью изменить эффект метода Delete, единственный возможный способ - использование метода RejectChanges, но после этого строка больше не удаляется.

Я не могу дать вам пример в LinQ, но, как правило, вам нужно сделать что-то вроде этого

for(int x = 0; x < datatable.Rows.Count; x++)
{
   DataRow r = dataTable.Rows[x];
   if(r.RowState == DataRowState.Deleted)
   {
       r.RejectChanges();
       .... //do you stuff
       r.Delete(); // redelete the row,
   }
}

Также, если вас интересуют только Удаленные строки, вы можете изменить приведенный выше код таким образом, чтобы извлечь из исходной таблицы подмножество удаленных строк.

DataTable deletedRowsTable = datatable.GetChanges(DataRowState.Deleted);
for(int x = 0; x < deletedRowsTable.Rows.Count; x++)
{
    .....
    // no more if needed here, because the rows are all deleted
    .....
}
Другие вопросы по тегам