更新后GridView行值未更改

时间:2013-04-22 05:50:44

标签: c# asp.net list gridview datatable

我想使用此代码更新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的文字?

5 个答案:

答案 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