1

我想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";

并且在编辑后“主题”列更改为“tx”,所以我不知道为什么在编辑前((TextBox)(row.Cells[4].Controls[0])).Text返回TextBox文本?

4

5 回答 5

1

因为您正在调用DataBind(); 每次刷新页面(POST 或 GET)时的方法,让我解释一下,如果用户将新值放入 TextBox 并单击更新按钮以触发res_RowUpdating,即使Page_Load也会触发并将 Gird 与旧值的数据库值绑定并忽略用户输入值。

于 2013-04-22T07:27:57.860 回答
0

也许更改已完成,但表单未更新。

尝试将 gridview 控件放在更新面板控件中并调用 UpdatePanel.Update()。

当您使用 Web 控件时,您看到的可能与实际不同,因为数据的更改不会在表示层中自动更新。

要解决这个“问题”,您可以对整个页面进行回发(检索所有内容),但这就像用火箭筒杀死苍蝇一样,因为您不需要所有内容,只需要已更新的内容,因此为此目的有几个允许您进行部分更新的工具,例如 AJAX 控件:UpdatePanel。

希望能帮助到你。

更新:调用 DataTable 上的 AcceptChanges() 方法并在 if(!PostBack) 之后擦除 Page_Load 上的 else 分支

于 2013-04-22T06:05:14.093 回答
0

我想,你只需要重新绑定网格

于 2013-04-22T07:27:25.227 回答
0

删除else您的page_load.

应该为你做。

每次有一个postback不需要时,您都在绑定网格。

于 2013-04-22T07:34:46.843 回答
0

调用 的AcceptChanges()方法,DataTable然后绑定GridView

于 2013-04-22T07:59:29.127 回答