2009-04-23 5 views
5

Ich weiß, wie man ein editierbares GridView zusammen mit einer SqlDataSource erhält, in der jede Änderung (Update/Einfügen/Löschen) sofort in der Datenbank gespeichert wird (mit dem UpdateCommand, InsertKommando, etc).Editierbares GridView, das Änderungen in ViewState bis zum Speichern speichert

Was ich jetzt brauche, ist eine editierbare GridView, die alle Änderungen im Viewstate behält, bis der Benutzer eine "Speichern" -Schaltfläche an anderer Stelle im Formular drückt.

Mit anderen Worten:

  1. Auf dem ersten Last, bevölkern die Gridview von DB-Daten
  2. machen Benutzer verschiedene Änderungen an die Daten, die die DB beharrt noch nicht, aber die überlebt durch eine beliebige Anzahl von Postbacks.
  3. Benutzer drückt speichern, und alle Änderungen an der DB

beharrte ich nehme an, ich werde benutzerdefinierten Code schreiben müssen, um die Daten in Schritt 3 zu beharren aber gibt es eine einfache, out-of- The-Box-Ansatz zu Schritt 2?

+1

1+ Ich muss genau dasselbe machen, hast du eine Lösung gefunden? –

Antwort

2

Sie möchten ein DataSet oder Datatable verwenden, und verwenden Sie die folgenden Schritte aus:

myDataSet.AcceptChanges(); 

Dies verpflichtet die Änderungen, wenn Sie diese Methode auf dem DataSet, Datatable aufrufen oder DataRow. Stellen Sie sich das fast wie eine SqlTransaction vor, bei der Sie ein Commit oder Rollback durchführen müssen. Hoffe das hilft!

siehe Link: Accept Changes

1

kann ich schlage vor, die folgendes zu tun:
1) Erstellen Sie eine benutzerdefinierte Liste Objekt, das Ihre Daten speichert. Laden Sie DB-Daten zu diesem Objekt hoch und speichern Sie sie im Sitzungszustand.

Objekt:

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; } 
    } 
} 

Hochladen von Daten in die Liste:

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

inv_clai= dataFromDB 

Speichern Sitzung:

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

2) binden gridview auf das Objekt und Daten manipulieren, wie Sie benötigen .

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) Daten aus dem Sitzungslistenobjekt in DB speichern, wenn sie bereit sind.