可编辑的GridView,用于存储viewstate中的更改,直到保存

时间:2009-04-23 18:42:32

标签: asp.net gridview viewstate

我知道如何拥有一个可编辑的GridView以及一个SqlDataSource,其中每个编辑(更新/插入/删除)都会立即保存到数据库中(使用SqlDataSource的UpdateCommand,Insertcommand等)。

我现在需要的是拥有一个可编辑的GridView,它可以维护viewstate中的所有编辑,直到用户在表单的其他位置按下“保存”按钮。

换句话说:

  1. 首次加载时,从DB数据填充GridView
  2. 用户对数据进行了各种编辑,这些编辑尚未持久保存到数据库,但通过任意数量的回发都可以存活。
  3. 用户按“保存”,所有更改将持久保存到数据库
  4. 我假设我需要编写自定义代码以在步骤3中保留数据,但是第2步是否采用了直接的,开箱即用的方法?

2 个答案:

答案 0 :(得分:2)

您想要使用DataSet或DataTable并使用以下内容:

myDataSet.AcceptChanges();

当您在DataSet,DataTable或DataRow上调用该方法时,它会提交更改。您可以将其视为需要提交或回滚的SqlTransaction。希望这有帮助!

请参阅链接:Accept Changes

答案 1 :(得分:1)

我可以建议做以下事项:
1)创建一个存储数据的自定义列表对象。将DB数据上载到该对象并将其保存到会话状态。

对象:

  public class InvestorClaim  
  {  
    public InvestorClaim()  
    {  
    }

    private int? _record_id;
    private int? _ic_record_id;
    private Int64? _lh_record_id;

    public int? record_id
    {
      get { return _record_id; }
      set { _record_id = value; }
    }

    public int? ic_record_id
    {
      get { return _ic_record_id; }
      set { _ic_record_id = value; }
    }

    public Int64? lh_record_id
    {
      get { return _lh_record_id; }
      set { _lh_record_id = value; }
    }  
} 

将数据上传到列表:

List<InvestorClaim> inv_claim = new List<InvestorClaim>();  

inv_clai= dataFromDB

保存到会话:

 HttpContext.Current.Session[ "InvestorClaimsObject" ] = inv_claim;

2)将gridview绑定到对象并根据需要操作数据。

  protected void yourGridView_Bind()  
  {   
    inv_claim = HttpContext.Current.Session[ "InvestorClaimsObject" ] as List<InvestorClaim>;  
    yourGridView.DataSource = inv_claim;  
    BindData();   
  }  

  protected void yourGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)  
  {      
    inv_claim = HttpContext.Current.Session[ "InvestorClaimsObject" ] as List<InvestorClaim>;  

    //Update the values.
    GridViewRow row = yourGridView.Rows[e.RowIndex];
    inv_claim[row.DataItemIndex].lh_record_id = ((TextBox)(row.Cells[1].Controls[0])).Text;
    inv_claim[row.DataItemIndex].ic_record_id = ((TextBox)(row.Cells[2].Controls[0])).Text;

    //Reset the edit index.
    yourGridView.EditIndex = -1;

    //Bind data to the GridView control.
    yourGridView.DataSource = inv_claim;
    BindData();  
}

3)准备好后,将数据从会话列表对象保存到数据库。