嘿伙计们,我有一个ASP.NET GridView绑定到一个包含DataTable的DataView。我没有使用DataAdapter。
我想更新DataTable中的一行,所以我这样做:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
DataView dv = (DataView)Session["My_DataTable"];
DataTable dt = dv.Table;
int rowIndex = GridView1.Rows[e.RowIndex];
dt.Rows[rowIndex]["FirstName"] = thenewfirstname;
dt.Rows[rowIndex]["MI"] = thenewmi;
dt.Rows[rowIndex]["LastName"] =thenewlastname;
Session["My_DataTable"] = dv;
//Reset the edit index.
GridView1.EditIndex = -1;
//Bind data to the GridView control.
GridView1.DataSource = Session["My_DataTable"];
GridView1.DataBind();
}
底层的DataView / DataTable已正确更改,但GridView包含编辑前的旧行和编辑后的新行(即,它添加了一个带有新编辑的附加行!)。
例如,如果我们有:
...
Sammy S Samerson
...
并将其更改为Sammy E Samerson
gridview说:
...
Sammy S Samerson
Sammy E Samerson
...
我如何解决这个问题,我做错了什么?
答案 0 :(得分:1)
发生了很多奇怪的事情。
所有Bad Things的要点都是DataView - 因为事情正在重新排序,GridView的索引和DataView中DataTable的索引不匹配。必须循环使用DataTable,直到找到正确的刚编辑的记录。
答案 1 :(得分:1)
您是否检查了编辑行的行索引? int rowIndex = GridView1.Rows [e.RowIndex];你可以直接使用e.RowIndex。
我的建议是使用表格的任何关键字段来获取行。
例如
DataRow[] customerRow =
dataSet1.Tables["Customers"].Select("CustomerID = 'ALFKI'");
customerRow[0]["CompanyName"] = "Updated Company Name";
customerRow[0]["City"] = "Seattle";
您可以使用单元格位置获取行值。或者使用datakeynames 例如:
string courseid = GridView1.Rows[e.RowIndex].Cells[3].Text;