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);
 }
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top