Редактируемый GridView, который сохраняет изменения в viewstate до сохранения - PullRequest
5 голосов
/ 23 апреля 2009

Я знаю, как иметь редактируемый GridView вместе с SqlDataSource, в котором каждое редактирование (обновление / вставка / удаление) немедленно сохраняется в базе данных (используя UpdateCommand SqlDataSource, Insertcommand и т. Д.).

Теперь мне нужно иметь редактируемый GridView, который поддерживает все изменения в viewstate, пока пользователь не нажмет кнопку «Сохранить» в другом месте формы.

Другими словами:

  1. При первой загрузке заполнить GridView из данных БД
  2. Пользователь вносит различные изменения в данные, которые еще не сохранены в БД, но которые сохраняются при любом количестве обратных передач.
  3. Пользователь нажимает Сохранить, и все изменения сохраняются в БД

Полагаю, мне нужно написать собственный код для сохранения данных на шаге 3, но есть ли простой, готовый подход к шагу 2?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2009

Вы хотите использовать DataSet или DataTable и использовать следующее:

myDataSet.AcceptChanges();

Это фиксирует изменения при вызове этого метода в DataSet, DataTable или DataRow. Думайте об этом почти как о SqlTransaction, где вам нужно зафиксировать или откатить. Надеюсь, это поможет!

см. Ссылку: Принять изменения

1 голос
/ 25 марта 2011

Могу предложить сделать следующее:
1) создать собственный объект списка, в котором хранятся ваши данные. Загрузить данные БД в этот объект и сохранить их в состоянии сеанса.

Объект:

  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) привязать сетку к объекту и манипулировать данными по мере необходимости.

  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) сохранить данные из объекта списка сеансов в БД, когда они будут готовы.

...