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
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.
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);
}
L'autre façon est
DataRow[] DrArrCheck = DataTableName.Select("ID > 0");
foreach(DataRow DrCheck in DrArrCheck)
{
DataTableName.Rows.Remove(DrCheck);
}
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))
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);
}
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();
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();
}
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.)
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
Essayez ceci
foreach(DataRow oRow in YourDataTable.Rows)
{
if ("Check You Condition")
{
YourDataTable.Rows.Remove(oRow);
}
}