2008-10-25 4 views
2

Я создал приложение, которое отображает записи из базы данных в окне и проверяет базу данных для новых записей каждые пару секунд. Проблема в том, что окно моргает каждый раз, когда я проверяю новые записи, и я хочу его исправить. Я попытался сравнить старый datatable с новым и обновить, только если они разные. Кто-нибудь знает, что лучше всего подходит для таких случаев? Я попытался сделать это следующим образом, но это не работает:Сравнение данных

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

ответ

2

Во-первых, это важно понимать, что то, что вы сравниваете в коде является ссылки из DataTables, а не содержание данных. Для того, чтобы определить, если оба DataTables имеют то же содержание, что вы будете иметь, чтобы перебрать все строки и столбцы и посмотреть, если они равны:

//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» метод так: `если (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] всегда истинно , Я изменил код следующим образом:

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; 

По сравнению с раствором Дэйва Markle в, шахтном лечит две таблицы с одинаковыми записями, но в разных порядках одинаковые. Надеюсь, это поможет тому, кто снова наткнется на эту нить.

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; 
    } 

// здесь эта функция дает логическое значение в качестве результата возвращает истину, если оба же еще вернуться ложным, если оба не то же самое