0

我试图找到一行,然后从数据表中删除该行。我不断得到 nIndex = -1。有人有建议吗?

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);
 }
}
4

2 回答 2

0

由于您创建了一个新的 DataRow

dr = dt.NewRow();

您不会在 DataTable 中找到它。

您要删除数据表中 IS 的行:

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

不是

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

编辑: 也许不是。您可能必须遍历整个 DataTable 并比较列中的值:

for (var i = dt.Rows.Count; i >= 0; i--)
  if (dt.Rows[i].Cells[1].Text == sSampleId) {
    dt.Rows.Remove(i);
    break;
  }
}
于 2009-09-29T15:03:51.660 回答
0

要查找和删除 ADO.NET 中DataTable给定 ID 的行:

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

Delete请注意,和之间存在差异RemoveDelete将行的状态更改为RowState.Deleted,这使得它从DataTable大多数用途中消失。但它仍然存在。如果您使用数据适配器将DataTableup 与基础数据库表同步,这一点很重要:适配器将在您调用其Update方法时删除基础行,然后才从Rows集合中删除该行。

如果您不使用数据适配器,则可以使用Remove删除一行。

于 2009-09-29T15:45:12.470 回答