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