2012-08-06 9 views
5

W aplikacji WinForm muszę rejestrować wszystkie zmiany w datagrid (datatable). Innymi słowy chcę uzyskać wszystkie zmiany, ponieważ zostały załadowane. Do tego chcę użyć Datatable.GetChanges(). Wiem, że z GetChanges() otrzymuję datatable zawierający kopię wszystkich wierszy oryginalnego DataSet, które oczekują zmian.GetChanges() lub RowState, aby uzyskać wszystkie zmiany datatable?

Moje pytanie brzmi teraz, czy możliwe jest uzyskanie więcej informacji o dodatkowych informacji o zmianach. Na przykład chcę wiedzieć, czy wiersz wiersz został dodano lub usunięty lub został tylko zaktualizowany. Jeśli wiersz został zaktualizowany Chciałbym również wiedzieć, które komórki zostały zaktualizowane? Czy istnieje sposób, aby szybko uzyskać wszystkie te informacje, czy muszę wykonać wiersz po wierszu rzędu z pierwotnym datatable?

A może lepiej użyć RowState, aby uzyskać wszystkie zmiany?

Odpowiedz

2

Każdy DataRow w wynikowej tabeli DataTable będzie miał ustawioną właściwość RowState, która wskaże, czy wiersz został dodany, usunięty czy zaktualizowany.

Nie wierzę jednak, że poszczególne komórki dostarczają informacji o aktualizacji - są one śledzone tylko wierszami.

8

Na czeku dodatek wiersz/delecji RowState

dla każdej pozycji w wierszu (aka komórce) Sprawdź DataRowVersion

 foreach (DataRow dr in dt.Rows) 
     { 
      if (dr.RowState == DataRowState.Modified) 
      { 
       var changedCols = new List<DataColumn>(); 
       foreach (DataColumn dc in dt.Columns) 
       { 
        if (!dr[dc, DataRowVersion.Original].Equals(
         dr[dc, DataRowVersion.Current])) /* skipped Proposed as indicated by a commenter */ 
        { 
         changedCols.Add(dc); 
        } 
       } 
       // now handle the changedCols list 
      } 
     } 
+0

Dziękuję za odpowiedź. Kilka uwag: 1) Musisz użyć Equals(), ponieważ "! =" Porównuje referencje zwróconych obiektów (i zwróci false, nawet jeśli obiekty zawierają tę samą wartość). 2) Musiałem użyć DataRowVersion.Current zamiast DataRowVersion.Proposed, ponieważ DataRowVersion.Proposed rzucił wyjątek. – nightcoder

Powiązane problemy