2012-08-06 31 views
5

Winforms應用程序我必須記錄datagrid(datatable)中的所有更改。換句話說,我想獲得所有更改,因爲它已被加載。爲此,我想使用Datatable.GetChanges()。我知道,GetChanges()我得到一個數據表,其中包含原始DataSet中所有具有未決更改行的副本。GetChanges()或RowState獲取數據表的所有更改?

我的問題是現在,如果它也有可能獲得更多更改的其他信息。例如,我想知道是否已被加入刪除或只有已更新。如果一行已更新我也想知道哪些單元格已更新?有沒有辦法快速獲得所有這些信息,還是我必須做一個深層比較原始數據表行?

還是更好地使用RowState獲得所有更改?

回答

2

生成的DataTable中的每個DataRow都將具有其RowState屬性集,該屬性集用於告知您該行是添加,刪除還是更新。

但我不相信單個單元格提供更新信息,但是它只能按行跟蹤。

8

對於行添加/刪除檢查RowState

對於行中的每一項(又名細胞)檢查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

謝謝您的回答。幾個註釋:1)您需要使用Equals(),因爲「!=」將比較返回對象的引用(即使對象包含相同的值,也會返回false)。 2)我不得不使用DataRowVersion.Current而不是DataRowVersion.Proposed,因爲DataRowVersion.Proposed拋出異常。 – nightcoder 2012-12-14 20:21:29

相關問題