2008-10-25 120 views
2

我構建了一個應用程序,它在窗口中顯示數據庫中的記錄,並每隔幾秒鐘檢查一次數據庫中的新記錄。問題是每次檢查新記錄時窗口都會閃爍,我想修復它。我試圖將舊數據表與新數據表進行比較,只有在不同時才進行刷新。 有誰知道這種情況下的最佳做法是什麼?我試着做下面的方式,但它不工作:比較數據表

private bool GetBelongingMessages() 
     { 
      bool result = false; 
      DataTable dtTemp = OleDbWorks.GetBelongingMessages(currentCallID); 
      if(dtTemp != dtMessages) 
      { 
       dtMessages = dtTemp; 
       result = true; 
      } 
      else 
      { 
       result = false; 
      } 
      return result; 
     } 

回答

2

首先,必須認識到,你在你的代碼比較什麼是引用是很重要的數據表,而不是內容的數據表。爲了確定兩個數據表具有相同的內容,你要通過所有的行和列的有循環,看看他們是平等的:

//This assumes the datatables have the same schema... 
     public bool DatatablesAreSame(DataTable t1, DataTable t2) {   
      if (t1.Rows.Count != t2.Rows.Count) 
       return false; 

      foreach (DataColumn dc in t1.Columns) { 
       for (int i = 0; i < t1.Rows.Count; i++) { 
        if (t1.Rows[i][dc.ColumnName] != t2.Rows[i][dc.ColumnName]) { 
         return false; 
        } 
       } 
      } 
      return true; 
     } 
+2

我建議加上「的ToString」方法這樣既相同否則返回false:`如果(T1。行[i] [dc.ColumnName] .ToString()!= t2.Rows [i] [dc.ColumnName] .ToString())`。比較可能會給出錯誤的答案35!= 35. – GoRoS 2012-01-27 21:04:07

+0

答案http://stackoverflow.com/a/7518099/52277也比較列數 – 2013-08-23 23:57:19

0

你要投的對象t1.Rows [i] [dc.ColumnName]和t1.Rows [i] [dc.ColumnName]否則語句t1.Rows [i] [dc.ColumnName]!= t2.Rows [i] [dc.ColumnName]永遠是true 。我修改代碼的方式如下:

for(int i = 0; i < t1.Rows.Count; i++) 
      { 
       if((string)t1.Rows[i][1] != (string)t2.Rows[i][1]) 
        return false; 
      } 

它的工作原理,但它不是一個優雅的解決方案。

1

我一直試圖找到一種方法,做了一段時間的DataTable比較和最後寫了我自己的功能,這裏是我的了:

bool tablesAreIdentical = true; 

// loop through first table 
foreach (DataRow row in firstTable.Rows) 
{ 
    foundIdenticalRow = false; 

    // loop through tempTable to find an identical row 
    foreach (DataRow tempRow in tempTable.Rows) 
    { 
     allFieldsAreIdentical = true; 

     // compare fields, if any fields are different move on to next row in tempTable 
     for (int i = 0; i < row.ItemArray.Length && allFieldsAreIdentical; i++) 
     { 
      if (!row[i].Equals(tempRow[i])) 
      { 
       allFieldsAreIdentical = false; 
      } 
     } 

     // if an identical row is found, remove this row from tempTable 
     // (in case of duplicated row exist in firstTable, so tempTable needs 
     // to have the same number of duplicated rows to be considered equivalent) 
     // and move on to next row in firstTable 
     if (allFieldsAreIdentical) 
     { 
      tempTable.Rows.Remove(tempRow); 
      foundIdenticalRow = true; 
      break; 
     } 
    } 
    // if no identical row is found for current row in firstTable, 
    // the two tables are different 
    if (!foundIdenticalRow) 
    { 
     tablesAreIdentical = false; 
     break; 
    } 
} 

return tablesAreIdentical; 

相比戴夫馬克爾的解決方案,我的治療兩張記錄相同,但順序不同的表格。希望這可以幫助任何人再次絆倒這個線程。

0
public Boolean CompareDataTables(DataTable table1, DataTable table2) 
    { 
     bool flag = true; 
     DataRow[] row3 = table2.Select(); 
     int i = 0;// row3.Length; 
     if (table1.Rows.Count == table2.Rows.Count) 
     { 
      foreach (DataRow row1 in table1.Rows) 
      { 
       if (!row1.ItemArray.SequenceEqual(row3[i].ItemArray)) 
       { 
        flag = false; 
        break; 
       } 
       i++; 
      } 

     } 
     else 
     { 
      flag = false; 
     } 
     return flag; 
    } 

//此處,此功能將得到布爾作爲結果返回true,如果如果兩個不相同的