Question

J'ai construit une application qui affiche les enregistrements de la base de données dans la fenêtre et vérifie la base de données à la recherche de nouveaux enregistrements toutes les deux secondes. Le problème est que la fenêtre clignote à chaque fois que je vérifie la présence de nouveaux enregistrements et que je souhaite le corriger. J'ai essayé de comparer l'ancien datatable avec le nouveau et de ne rafraîchir que s'ils sont différents. Est-ce que quelqu'un sait quelle est la meilleure pratique pour de tels cas? J'ai essayé de le faire de la manière suivante mais cela ne fonctionne pas:

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

La solution

Tout d’abord, il est important de reconnaître que ce que vous comparez dans votre code correspond aux références des tables de données, et non au contenu des tables de données. Pour déterminer si les deux tables de données ont le même contenu, vous devrez parcourir toutes les lignes et toutes les colonnes et voir si elles sont égales:

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

Autres conseils

Cela faisait un moment que je cherchais un moyen de comparer DataTable et que j'ai fini par écrire ma propre fonction, voici ce que j'ai obtenu:

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;

Par rapport à la solution de Dave Markle, la mienne traite deux tables avec les mêmes enregistrements mais dans des ordres différents identiques. J'espère que cela aidera ceux qui trébuchent à nouveau sur ce fil.

Vous devez convertir les objets t1.Rows [i] [dc.ColumnName] et t1.Rows [i] [dc.ColumnName] sinon l'instruction t1.Rows [i] [dc.ColumnName]! = t2.Rows [i] [dc.ColumnName] est toujours vrai. J'ai modifié le code de la manière suivante:

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

et cela fonctionne mais ce n'est pas une solution élégante.

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

// ici, cette fonction donnera un booléen car le résultat retournera true si les deux sont identiques sinon retournera false si les deux ne sont pas identiques

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top