Comment supprimer plusieurs lignes dans un DataTable?

Comment puis-je supprimer des DataRows spécifiques dans une boucle d'une ligne DataTable qui répond à une condition personnalisée-disons les lignes ayant un index de nombre pair -? (Sans utiliser LINQ)

Merci

28
demandé sur pencilCake 2010-05-26 17:08:57

10 réponses

Cela dépend de ce que vous entendez par "supprimer".

Si vous voulez dire les marquer comme supprimés , appelez simplement la méthode Delete() sur chaque ligne lorsque vous la Visitez dans votre boucle. Vous devez ensuite appeler AcceptChanges() sur la table de données pour finaliser la suppression-probablement après la mise à jour de votre base de données (si elle est impliquée).

foreach( DataRow row in someTable.Rows )
{
    if( /* your condition here */ )
        row.Delete();
}
someTable.AcceptChanges();

Si vous voulez dire le supprimer du DataTable, alors vous devez le faire en deux passes:

List<DataRow> rowsToDelete = new List<DataRow>();
foreach( DataRow row in someTable.Rows )
{
    if( /* your condition here */ )
    {
        rowsToDelete.Add( row );
    }
}

foreach( DataRow row in rowsToDelete )
{
    someTable.Rows.Remove( row );
}

Il convient de souligner que vous pouvez toujours utiliser la première méthode pour supprimer des lignes - puisque marquer des lignes comme Deleted, puis accepter les modifications les supprimera automatiquement de la table. Mais, parfois, il est plus clair et efficace de simplement supprimer les objets DataRow de la collection Rows.

52
répondu LBushkin 2010-05-26 13:26:39

Essayez quelque chose comme cet exemple

DataTable table = new DataTable();
table.Columns.Add("Foo",typeof(int));
for (int i = 0; i < 10; i++)
    table.Rows.Add(i);

for (int i = table.Rows.Count -1; i >=0; i--)
{
    // sample removes all even foos
    if ((int)table.Rows[i]["Foo"] % 2 == 0)
        table.Rows.RemoveAt(i);
}
9
répondu Anthony Pegram 2010-05-26 13:14:17

L'autre façon est

    DataRow[] DrArrCheck = DataTableName.Select("ID > 0");
    foreach(DataRow DrCheck in DrArrCheck)
    {
        DataTableName.Rows.Remove(DrCheck);
    }
4
répondu BharathiNathan 2010-09-23 11:43:29

Si vous voulez une solution plus courte que celles proposées ci-dessus, essayez de boucler la liste des résultats, et en utilisant un lambda comme sub(x) pour supprimer chacune de ces lignes.

dt.Select("Column1 > 0").ToList.ForEach(Sub(x) dt.Rows.Remove(x))
4
répondu Sergey 2015-08-10 23:30:01
 public static void DeleteRowsFromDataTable(DataTable dataTable, string columnName, string columnValue)
        {
            IEnumerable<DataRow> dataRows = (from t in dataTable.AsEnumerable()
                                             where t.Field<string>(columnName) == columnValue
                                             select t);
            foreach (DataRow row in dataRows)
                dataTable.Rows.Remove(row);
        }
1
répondu Vin 2011-07-28 16:48:26

Pour supprimer plusieurs lignes (par exemple 50 000 Sur 100 000) , il est beaucoup plus rapide de copier la base de données que de faire l'une ou l'autre datatable.Rangée.Supprimer (ligne) ou ligne.Supprimer(). Par exemple:

DataRow[] rowsToKeep = datatable.Select("ID > 50000");
DataTable tempDataTable= rowsToKeep.CopyToDataTable;
dataTable.Clear();
dataTable.Merge(tempDataTable);
tempDataTable.Dispose();
1
répondu tval 2017-02-01 20:27:50

Essayez d'itérer sur le résultat de Select (). C'est assez similaire aux autres réponses, mais je trouve que c'est le plus direct

DataRow[] r = table.Select();
for (int i = 0; i < r.Length; i++)
{
    if (i % 2 == 0)
        r[i].Delete();
}
0
répondu Kleinux 2010-05-26 13:41:42

J'ai toujours utilisé l'approche "en deux phases" de LBushkin et j'ai finalement décidé que cela valait la peine d'écrire une fonction pour cela:

    public delegate bool DataRowComparer(DataRow dr);

    public static void RemoveDataRows(DataTable table, DataRowComparer drc)
    {
        List<DataRow> RowsToRemove = new List<DataRow>();
        foreach (DataRow dr in table.Rows)
            if (drc(dr))
                RowsToRemove.Add(dr);
        foreach (DataRow dr in RowsToRemove)
            table.Rows.Remove(dr);
    }

Et maintenant je peux supprimer des lignes avec une ligne de code (par exemple):

RemoveDataRows(dt, row => row["StringVal"].ToString() == "B" && (Int16)(row["NumberVal"]) >= 4);

Au cas où cela aiderait quelqu'un...

(et tous les moyens d'abréger davantage sont appréciés.)

0
répondu user2524845 2014-06-02 17:40:41

C'est comme ça que je l'ai fait quand j'ai rencontré ce problème.

Dim index As Integer = 0
Dim count As Integer = resultsDT.Rows.Count - 1
For i As Integer = 0 To count
    If resultsDT.Rows(index).Item("something") = "something" Then                               
        resultsDT.Rows(index).Delete()
        resultsDT.AcceptChanges()
        index = index - 1
    End If
    index = index + 1
    i = i + 1
Next
-1
répondu Jordan 2012-12-06 19:03:47

Essayez ceci

foreach(DataRow oRow in YourDataTable.Rows)
{
  if ("Check You Condition")
   {
      YourDataTable.Rows.Remove(oRow);
   }
}
-2
répondu Johnny 2010-05-26 15:48:38