web-dev-qa-db-fra.com

Suppression d'une ligne de datatable en C #

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? 

9
Norman

Essayez d’utiliser Delete method:

    DataRow[] drr = dt.Select("Student=' " + id + " ' "); 
    for (int i = 0; i < drr.Length; i++)
        drr[i].Delete();
    dt.AcceptChanges();
16
manji

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); 
} 
3
Wicked Coder

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:

http://www.codeguru.com/forum/showthread.php?t=471027

2
IAmTimCorey

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.

0
Soenhay

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).

0
user3158591

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();
        }
0
Parag555

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);
0
Karthikeyan P