Domanda

Ho creato un'applicazione che visualizza i record dal database nella finestra e controlla il database per nuovi record ogni paio di secondi. Il problema è che la finestra lampeggia ogni volta che controllo nuovi record e voglio ripararlo. Ho provato a confrontare il vecchio datatable con quello nuovo e aggiornare solo se sono diversi. Qualcuno sa qual è la migliore pratica per tali casi? Ho provato a farlo nel modo seguente ma non funziona:

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

Soluzione

Prima di tutto, è importante riconoscere che ciò che stai confrontando nel tuo codice sono i riferimenti dei database, non i contenuti dei database. Per determinare se entrambi i database hanno gli stessi contenuti, dovrai scorrere tutte le righe e le colonne e vedere se sono uguali:

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

Altri suggerimenti

Ho cercato di trovare un modo per fare il confronto DataTable per un po 'e ho finito per scrivere la mia funzione, ecco cosa ho ottenuto:

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;

Rispetto alla soluzione di Dave Markle, la mia tratta due tabelle con gli stessi record ma in ordini diversi identici. Spero che questo aiuti chiunque inciampa di nuovo su questo thread.

Devi lanciare oggetti t1.Rows [i] [dc.ColumnName] e t1.Rows [i] [dc.ColumnName] altrimenti l'istruzione t1.Rows [i] [dc.ColumnName]! = t2.Rows [i] [dc.ColumnName] è sempre vero. Ho modificato il codice nel modo seguente:

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

e funziona ma non è una soluzione elegante.

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

// qui questa funzione darà valore booleano come risultato return true se entrambi sono uguali altrimenti return false se entrambi non sono uguali

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top