2010-08-05 6 views
0

Im développant un contrôle utilisateur qui contient deux RadGrids. Lorsqu'un utilisateur sélectionne une ligne dans la grille 1, la page postsback. À ce stade, je crée un Datatable et DataRow et l'ajoute à la source de données de la grille 2.Viewstate, datatable et propriétés!

Le problème que je rencontre globalement est que le datatable est perdu et recréé chaque fois que la page est postée. J'ai donc essayé de sauvegarder la datatable dans le viewstate en utilisant une propriété, mais cela ne semble pas avoir aidé. Je suis assez nouveau à l'utilisation des propriétés arrêt complet, donc mon code est peut-être faux.

Ma solution:

public class DynamicDocumentSelectorWebUITypeEditor : Telerik.Cms.Web.UI.WebUITypeEditor<string> 
    { 

    private System.Data.DataTable _oDataTable; 

public System.Data.DataTable getTable() { 

     System.Data.DataTable oDataTable = new System.Data.DataTable(); 
     oDataTable.Columns.Add(new System.Data.DataColumn("DocumentID", typeof(string))); 
     oDataTable.Columns.Add(new System.Data.DataColumn("DocumentName", typeof(string))); 
     oDataTable.Columns.Add(new System.Data.DataColumn("DocumentExtension", typeof(string))); 

     return oDataTable; 

    } 

public System.Data.DataTable oDataTable { 
     get { 
      object o = this.ViewState["DataTable"]; 
      if(o == null) { 
       return _oDataTable; 
      } 
      return (System.Data.DataTable)o; 
     } 
     set { 
      this._oDataTable = value; 
      this.ViewState["DataTable"] = value; 
     } 
    } 

    protected override void CreateChildControls() { 
     base.CreateChildControls(); 

     if (this.oDataTable == null) { 

      this.oDataTable = getTable(); 

     } 

     } 

//the following function is executed when a row in grid 1 is selected 
    protected void GridDocumentsInLibrary_SelectedIndexChanged(object sender, EventArgs e) { 

     //loop through each selected row 
     foreach (Telerik.Web.UI.GridDataItem oItem in GridDocumentsInLibrary.SelectedItems) { 

      //System.Data.DataTable oDt = this.oDataTable; 

      foreach (System.Data.DataRow oDataRow in this.oDataTable.Rows) { 

       //check whether the row already exists in the datatable 
       //if (oDataRow["DocumentID"] != oItem["DocumentID"].Text) { 

        System.Data.DataRow dr = this.oDataTable.NewRow(); 
        dr["DocumentID"] = oItem["DocumentID"].Text; 
        dr["DocumentName"] = oItem["DocumentName"].Text; 
        dr["DocumentExtension"] = oItem["DocumentExtension"].Text; 
        this.oDataTable.Rows.Add(dr); 

       //} 

      } 

     } 

     //set datasource of second grid 
     GridSelectedDocuments.DataSource = this.oDataTable; 
     GridSelectedDocuments.DataBind(); 

    } 

} 

ce que je fais tout à fait tort? Quelqu'un peut-il aider?

Merci à l'avance higgsy

+0

Lorsque vous dites 'Ma solution', voulez-vous dire que cet extrait de code fonctionne? – Rabid

Répondre

1

appelez-vous Page.DataBind sans vérifier si oui ou non Page.IsPostBack est vrai? Cela entraînerait la reliaison de la deuxième grille et, sans une source de données définie, sera vide. A part cela, en définissant la source de données et en la liant dans SelectedIndexChanged, si ViewState est activé, le second RadGrid devrait conserver ses données.