2009-09-29 7 views
0

J'essaie de trouver une ligne, puis supprimer cette ligne d'une datatable. Je continue d'obtenir nIndex = -1. Quelqu'un a des suggestions?DataTable Rows.IndexOf()

protected void cbxSelected_CheckedChanged(object sender, EventArgs e) 
{ 
CheckBox checkbox = (CheckBox)sender; 
GridViewRow row = (GridViewRow)checkbox.NamingContainer; 
string sSampleId = row.Cells[1].Text; 

if (!string.IsNullOrEmpty(sSampleId)) 
{ 
    DataTable dt; 

    if (ViewState["dtTemp"] != null) 
    { 
    dt = (DataTable)ViewState["dtTemp"]; 
    } 
    else 
    { 
    dt = new DataTable(); 
    dt.Columns.Add("sample_id"); 
    } 

    DataRow dr; 
    string[] drow = new string[] { sSampleId }; 
    dr = dt.NewRow(); 
    dr.ItemArray = drow; 

    if (checkbox.Checked == true) 
    { 
    dt.Rows.Add(dr); 
    } 
    else if (checkbox.Checked == false) 
    { 
    int nIndex = dt.Rows.IndexOf(dr); 
    dt.Rows.RemoveAt(nIndex); 
    } 

    ViewState.Add("dtTemp", dt); 
} 
} 

Répondre

0

Depuis la création d'un nouveau DataRow

dr = dt.NewRow(); 

vous ne trouverez pas dans le DataTable.

Vous voulez supprimer la ligne qui se trouve dans le DataTable:

int nIndex = dt.Rows.IndexOf(row); 

pas

int nIndex = dt.Rows.IndexOf(dr); 

Edit: Ou peut-être pas. Vous aurez probablement à boucle à travers l'ensemble de DataTable et de comparer la valeur dans la colonne:

for (var i = dt.Rows.Count; i >= 0; i--) 
    if (dt.Rows[i].Cells[1].Text == sSampleId) { 
    dt.Rows.Remove(i); 
    break; 
    } 
} 
+0

J'ai pensé en construisant le datarow que je pourrais trouver cette rangée dans le datatable. Je me souviens de l'avoir fait en vb, mais C# semble être un peu plus radin. J'ai essayé votre suggestion de faire une boucle sur la table et de supprimer la ligne sur une trouvaille, cela fonctionne. Merci pour la contribution. – Kris

0

Pour rechercher et supprimer une ligne dans un ADO.NET DataTable donné son ID:

DataRow[] found = dt.Select("sample_id = " + sample_id); 
if (found.Length < 0) 
{ 
    found[0].Delete(); 
} 

Remarque qu'il y a une différence entre Delete et Remove. Delete modifie l'état de la ligne à RowState.Deleted, ce qui le fait disparaître du DataTable dans la plupart des cas. Mais ça existe toujours. Ceci est important si vous utilisez un adaptateur de données pour synchroniser le DataTable avec une table de base de données sous-jacente: l'adaptateur supprime la ligne sous-jacente lorsque vous appelez sa méthode Update et supprime uniquement la ligne de la collection Rows.

Si vous n'utilisez pas d'adaptateur de données, vous pouvez utiliser Remove pour supprimer une ligne.