数据表Rows.IndexOf()
-
18-09-2019 - |
题
我试图找到一个行,然后从数据表中删除该行。我不断收到参数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);
}
}
解决方案
由于您创建一个新的DataRow
dr = dt.NewRow();
您不会在数据表中找到它。
您要删除,在数据表上的行:
int nIndex = dt.Rows.IndexOf(row);
不
int nIndex = dt.Rows.IndexOf(dr);
修改强> 或者可能不是。你可能会在整个数据表必须循环和列比较值:
for (var i = dt.Rows.Count; i >= 0; i--)
if (dt.Rows[i].Cells[1].Text == sSampleId) {
dt.Rows.Remove(i);
break;
}
}
其他提示
要找到和在给定的其ID的ADO.NET DataTable
删除行:
DataRow[] found = dt.Select("sample_id = " + sample_id);
if (found.Length < 0)
{
found[0].Delete();
}
请注意有Delete
和Remove
之间的差。 Delete
改变该行的状态RowState.Deleted
,这使得它从DataTable
在大多数情况消失。但它仍然存在。这一点很重要,如果您使用的是数据适配器与底层数据库表同步的DataTable
了:当你打电话的Update
方法,然后才从Rows
集合中删除该行的适配器将删除基础行
如果你不使用数据适配器,它是确定使用Remove
删除一行。
不隶属于 StackOverflow