我想使用此代码更新GridView
中的行,但在编辑GridView
后没有更改:
protected void res_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//Retrieve the table from the session object.
DataTable dt = (DataTable)Session["dt"];
GridViewRow row =res.Rows[e.RowIndex];
dt.Rows[row.DataItemIndex]["name"] = ((TextBox)(row.Cells[6].Controls[0])).Text;
dt.Rows[row.DataItemIndex]["dewey"] = ((TextBox)(row.Cells[5].Controls[0])).Text;
*dt.Rows[row.DataItemIndex]["subject"] = ((TextBox)(row.Cells[4].Controls[0])).Text;
Session["dt"] = dt;
res.EditIndex = -1;
res.DataSource = dt;
res.DataBind();
}
我的Page_Load
:
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt;
if (!IsPostBack)
{
dt= Converter.ListBooks(new classes.Book().GetAll());
Session["dt"] = dt;
res.DataSource = dt;
res.DataBind();
}
else
{
dt=(DataTable)Session["dt"];
res.DataSource = dt;
res.DataBind();
}
}
例如我改变了*的行:
dt.Rows[row.DataItemIndex]["subject"] = "tx";
并且在编辑“subject”列后更改为“tx”,所以我不知道为什么((TextBox)(row.Cells[4].Controls[0])).Text
在编辑之前返回TextBox
的文字?
答案 0 :(得分:1)
因为每次页面刷新(POST或GET)时都要调用 DataBind(); 方法,如果用户将新值放在TextBox中并单击“更新”按钮来触发,请让我解释一下 res_RowUpdating 甚至 Page_Load 将使用数据库值触发并绑定Gird,这些值是旧值并忽略用户输入值。
答案 1 :(得分:0)
可能已完成更改,但表单未更新。
尝试将gridview控件放在Update Panel Control中并调用UpdatePanel.Update()。
使用Web控件时,您看到的内容可能与实际不同,因为数据中的更改不会在表示层中自动更新。
要解决这个“问题”,您可以对整个页面进行回发(检索所有内容),但这就像用火箭筒杀死一只苍蝇,因为您不需要所有内容,只需更新内容,因此为此目的有几个工具允许您进行部分更新,例如AJAX控件:UpdatePanel。
希望它有所帮助。
更新:调用DataTable上的AcceptChanges()方法并在if(!PostBack)之后删除Page_Load上的else分支
答案 2 :(得分:0)
我认为,你只需要重新绑定网格
答案 3 :(得分:0)
删除else
中的page_load
部分。
应该为你做。
每次有postback
时,您都会绑定网格。
答案 4 :(得分:0)
调用AcceptChanges()
的{{1}}方法,然后绑定DataTable
。