2010-03-19 12 views
3

J'ai un contrôle utilisateur imbriqué dans un répéteur. Dans mon contrôle utilisateur, j'ai un autre répéteur et j'ai un panneau.LoadViewState non activé sur mon contrôle utilisateur

J'essaie de remplacer l'événement LoadViewState de mon contrôle utilisateur et d'ajouter dynamiquement des contrôles au panneau. Je veux le faire dans LoadViewState afin que les contrôles dynamiques soient ajoutés avant que le viewstate soit chargé, afin qu'ils conservent leurs valeurs après les post-retours.

Pour une raison quelconque, l'événement LoadViewState sur le contrôle utilisateur (ascx) ne se déclenche pas. Y a-t-il un moyen de forcer le feu, ou y a-t-il une autre méthode que je pourrais utiliser? J'ai exclu l'événement de répéteur de données de contrôle d'utilisateur, parce que j'ai besoin de lui pour fonctionner même si la liaison de données ne se produit pas et je ne peux pas le faire sur l'événement créé par répéteurs parce que le panneau enfant et html interne n'existe pas encore.

+0

pouvez-vous poster votre code-behind? ou un échantillon de celui-ci? –

Répondre

6

LoadViewState n'est pas l'endroit approprié pour ajouter des contrôles enfants. Pour ajouter dynamiquement des contrôles dans un contrôle utilisateur, vous devez regarder la méthode CreateChildControls.

Il ne déclenche pas un événement LoadViewState car vous devez enregistrer au moins une valeur dans le ViewState pour déclencher l'événement.

+0

que diriez-vous de WebCotnrols? LoadViewState n'est pas déclenché dans mon WebControl. J'ai créé une classe qui hérite de WebControl. –

0

Je pense que j'ai eu un problème similaire avec certains contrôles utilisateur enfants créés dynamiquement. LoadViewState n'a pas été appelé dans les publications même si j'étais en mesure d'accéder à leur ViewState lors de leur création en premier. SaveViewState semblait être également appelé correctement. Il s'est terminé que les enfants ViewState n'étaient pas vraiment utilisables (sans qu'il en résulte une exception) dans l'événement page Init avant qu'ils ne soient entièrement initialisés, et cela ne s'est produit que lorsque les contrôles ont été ajoutés au parent. Après avoir assuré cela, les enfants ViewState a été correctement persisté à travers les publications.

// Belongs to a Page. If you create the children control in the 
    // Load event in you can also access the page ViewState 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      for (int it = 0; it < 5; it++) 
      { 
       ChildControl child = LoadControl("ChildControl.ascx") 
        as ChildControl; 
       child.ParentPage = this; 
       TabPanel tab = tabContainer.FindControl("TabPanel" + it) 
        as TabPanel; 
       // Ensure to add the child control to its parent before 
       // accessing its ViewState! 
       tab.Controls.Add(child);  // <--- 
       string caption = "Ciao" + it; 
       child.Caption = caption;  // Here we access the ViewState 
       tab.HeaderText = caption; 
       tab.Visible = true; 
       _Children.Add(child); 
      } 
     } 
     [...] 
    } 

    // Belongs to ChildControl 
    public string Caption 
    { 
     get { return ViewState["Caption"] as string; } 
     internal set { this.ViewState["Caption"] = value; } 
    }