4

我有一个正确绑定的 ASP.Net gridview。在编辑时我正在编辑某些字段。然后在我还需要编辑其他行之后。但是当我尝试编辑其他行时,以前编辑的行被重置 n 保留它们的旧价值观。

要求是这样的,我必须编辑许多行并且单击按钮我需要将所有编辑值推送到数据库

4

7 回答 7

2

您需要在回发之间维护 GridView 的数据源。

您可以通过将 DataTable 存储在 Cache、Session 或任何持久性存储中来做到这一点。

编辑一行后,将更改保存到此 DataTable,然后重新绑定 Gridview(来自此 DataTable)。

当用户点击“全部保存”时,您可以将DataTable的更改行保存到数据库中。

如果您需要跟踪哪些行已更改,您可以维护缓存或 Session 中已更改的 PrimaryKey 列表。

于 2013-03-05T05:39:35.890 回答
0

在绑定网格之前,您是否在 Page_Load 事件中检查 !IsPostBack ?如果您没有在 Page_Load 事件中绑定网格,请发布绑定网格的代码。

于 2013-03-05T05:41:40.657 回答
0

protected void grdRepayment_RowEditing(对象发送者,GridViewEditEventArgs e)

{

    grdRepayment.EditIndex = e.NewEditIndex;
    myDatatable = (DataTable)Session["TempTable"];
    grdRepayment.DataSource = myDatatable;
    grdRepayment.DataBind();

}

这就是我们需要在 RowEditing 和 RowCancelingEdit 中绑定网格的方式

于 2013-03-06T06:27:03.157 回答
0

您的代码的问题是,您在页面加载时绑定了网格。所以当页面加载时,它可以绑定数据库中的值。对于 Post back 上的 write bind 方法,并在您单击保存按钮时使用该会话或隐藏字段更新数据库时,还维护您在会话或隐藏字段上的值。

于 2013-03-05T06:00:42.673 回答
0

早上布莱恩......这是从gridview获取值到数据表的代码

私人无效getGridInfo()

{

    DataTable dt = new DataTable();
    DataRow dr;
    dt.Columns.Add(new System.Data.DataColumn("Select", typeof(byte)));
    dt.Columns.Add(new System.Data.DataColumn("Client", typeof(string)));
    dt.Columns.Add(new System.Data.DataColumn("PrincipleAmt", typeof(double)));



    foreach (GridViewRow row in grdRepayment.Rows)
    {
        CheckBox Select = (CheckBox)row.FindControl("ChkSelect");
        Label ClientName = (Label)row.FindControl("lblClientName");
        Label Principal = (Label)row.FindControl("lblPricipal");

        dr = dt.NewRow();
        dr[0] = Convert.ToByte(Select.Checked);
        dr[1] = ClientName.Text;
        dr[2] = Convert.ToDouble(Principal.Text);

        dt.Rows.Add(dr);
    }
    Session["TempTable"] = dt;
}
于 2013-03-06T06:19:58.790 回答
0

现在这里是更新保存数据表的会话变量的代码,这必须在 Gridview 的 RowUpdating 事件中完成。

protected void grdRepayment_RowUpdating(对象发送者,GridViewUpdateEventArgs e)

{

        DataTable myDatatable;
        GridViewRow row = grdRepayment.Rows[e.RowIndex]; 
        grdRepayment.EditIndex = -1; 

        if (row != null)
        {
            myDatatable = (DataTable)Session["TempTable"];
            for (int i = 0; i < myDatatable.Rows.Count; i++)
            {
                if (e.RowIndex == i)
                {

                    myDatatable.Rows[i][1] = Convert.ToString(Client);
                    myDatatable.Rows[i][2] = Convert.ToString(Principal);

                    Session["TempTable"] = myDatatable;
                    grdRepayment.EditIndex = -1;
                    grdRepayment.DataSource = myDatatable;
                    grdRepayment.DataBind();

                }
            }
        }
      }

并确保仅在 RowEditing 和 RowCancellingEdit 事件中从该会话变量绑定网格。完成编辑后,只需单击按钮,将编辑的内容推送到数据库...

于 2013-03-06T06:23:48.197 回答
0

请检查您的 gridview 绑定方法是调用页面加载和内部!isPostBack?

为了

Void page_load()
{
if(!IsPostBack)

{
//Call GridView Binding method
}

}
于 2013-03-06T06:24:51.487 回答