Table Rows.IndexOf ()
-
18-09-2019 - |
Frage
Ich versuche, um eine Zeile zu finden und dann diese Zeile aus einer Datentabelle löschen. Ich erhalte nIndex = -1. Wer Anregungen?
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);
}
}
Lösung
Da Sie eine neue DataRow
dr = dt.NewRow();
Sie werden nicht finden sie in der Datatable.
Sie möchten die Zeile entfernen, die in der Datatable IS:
int nIndex = dt.Rows.IndexOf(row);
nicht
int nIndex = dt.Rows.IndexOf(dr);
Edit: Oder vielleicht nicht. Sie werden wahrscheinlich eine Schleife durch die gesamte Datentabelle haben und den Wert in der Spalte vergleichen:
for (var i = dt.Rows.Count; i >= 0; i--)
if (dt.Rows[i].Cells[1].Text == sSampleId) {
dt.Rows.Remove(i);
break;
}
}
Andere Tipps
finden und eine Zeile in einem ADO.NET DataTable
aufgrund seiner ID löschen:
DataRow[] found = dt.Select("sample_id = " + sample_id);
if (found.Length < 0)
{
found[0].Delete();
}
Beachten Sie, dass es einen Unterschied gibt zwischen Delete
und Remove
. Delete
ändert die Zeile des Staates RowState.Deleted
, die sie von der DataTable
für die meisten Zwecke verschwinden lässt. Aber es ist noch vorhanden. Dies ist wichtig, wenn Sie einen Datenadapter verwenden die DataTable
up mit einer zugrunde liegenden Datenbanktabelle zu synchronisieren. Der Adapter wird die darunter liegende Zeile löschen, wenn Sie seine Update
Methode aufrufen und dann erst die Zeile aus der Rows
Sammlung entfernen
Wenn Sie nicht einen Datenadapter verwenden, ist es OK Remove
zu verwenden, um eine Zeile zu entfernen.