J'ai un problème pour supprimer des lignes d'un datatable. Dans mon programme, je lis les informations d'une base de données dans un datatable en utilisant une requête SQL. J'utilise une connexion oledb et le code dt.Load(command.ExecuteReader());
pour le faire. Plus tard, je veux supprimer les lignes qui correspondent à une chaîne d’identifiant. J'ai essayé que le code suivant ne puisse pas fonctionner:
DataRow[] drr = dt.Select("Student=' " + id + " ' ");
for (int i = 0; i < drr.Length; i++)
dt.Rows.Remove(drr[i]);
dt.AcceptChanges();
Quelqu'un peut-il s'il vous plaît suggérer une autre façon avec un exemple?
Essayez d’utiliser Delete method:
DataRow[] drr = dt.Select("Student=' " + id + " ' ");
for (int i = 0; i < drr.Length; i++)
drr[i].Delete();
dt.AcceptChanges();
Il y a plusieurs façons de le faire. Mais vous pouvez utiliser l'approche suivante:
List<DataRow> RowsToDelete = new List<DataRow>();
for (int i = 0; i < drr.Length; i++)
{
if(condition to delete the row)
{
RowsToDelete.Add(drr[i]);
}
}
foreach(var dr in RowsToDelete)
{
drr.Rows.Remove(dr);
}
Cette question vous expliquera comment supprimer un enregistrement d'un DataTable:
DataTable, Comment supprimer des lignes de manière conditionnelle
Cela ressemblerait à ceci:
DataRow[] drr = dt.Select("Student=' " + id + " ' ");
foreach (var row in drr)
row.Delete();
N'oubliez pas que si vous souhaitez mettre à jour votre base de données, vous devez appeler la commande Update. Pour plus d'informations à ce sujet, voir ce lien:
Je pense que la raison pour laquelle le code OP ne fonctionne pas, c'est parce qu'une fois que vous avez appelé Supprimer, vous modifiez la longueur de drr. Lorsque vous appelez Delete, vous ne supprimez pas réellement la ligne tant que AcceptChanges n’est pas appelé. C'est pourquoi, si vous souhaitez utiliser l'option Supprimer, vous avez besoin d'une boucle distincte.
Selon la situation ou la préférence ...
string colName = "colName";
string comparisonValue = (whatever it is).ToString();
string strFilter = (dtbl.Columns[colName].DataType == typeof(string)) ? "[" + colName + "]='" + comparisonValue + "'" : "[" + colName + "]=" + comparisonValue;
string strSort = "";
DataRow[] drows = dtbl.Select(strFilter, strSort, DataViewRowState.CurrentRows);
Ci-dessus utilisé pour les deux prochains exemples
foreach(DataRow drow in drows)
{
drow.Delete();//Mark a row for deletion.
}
dtbl.AcceptChanges();
OR
foreach(DataRow drow in drows)
{
dtbl.Rows[dtbl.Rows.IndexOf(drow)].Delete();//Mark a row for deletion.
}
dtbl.AcceptChanges();
OR
List<DataRow> listRowsToDelete = new List<DataRow>();
foreach(DataRow drow in dtbl.Rows)
{
if(condition to delete)
{
listRowsToDelete.Add(drow);
}
}
foreach(DataRow drowToDelete in listRowsToDelete)
{
dtbl.Rows.Remove(drowToDelete);// Calling Remove is the same as calling Delete and then calling AcceptChanges
}
Notez que si vous appelez Delete (), vous devez appeler AcceptChanges () mais si vous appelez Remove (), AcceptChanges () n'est pas nécessaire.
En outre, voici un bon lien sur la syntaxe du filtre de ligne.
Je vois un certain nombre de réponses à l'aide de la méthode Remove et d'autres à l'aide de la méthode Delete.
Supprimer (selon la documentation) supprimera immédiatement l'enregistrement de la table (locale) et, lors de la mise à jour, ne supprimera pas un enregistrement manquant.
Supprimer lors de la comparaison modifie RowState en Supprimé et met à jour la table du serveur lors de la mise à jour. De même, l'appel de la méthode AcceptChanges avant la mise à jour sur la table du serveur réinitialisera tous vos RowState sur Unchanged et rien ne sera transmis au serveur. (Allaite toujours mon pouce après avoir frappé cela plusieurs fois).
Advance for loop
fonctionne mieux dans ce cas
public void deleteRow(DataRow selectedRow)
{
foreach (DataRow in StudentTable.Rows)
{
if (SR[TableColumn.StudentID.ToString()].ToString() == StudentIndex)
SR.Delete();
}
StudentTable.AcceptChanges();
}
Si vous souhaitez supprimer la ligne entière de DataTable ,
essaye ça
DataTable dt = new DataTable(); //User DataTable
DataRow[] rows;
rows = dt.Select("Student=' " + id + " ' ");
foreach (DataRow row in rows)
dt.Rows.Remove(row);