2010-10-18 28 views
0

J'ai créé un contrôle composite avec les détails de l'échantillon comme suit. Fondamentalement, la première fois sur la page charger le contrôle définit une variable d'état d'affichage et le problème est que sur post-retour (lorsque le bouton est cliqué), la variable ViewState est nulle. J'ai fait des recherches approfondies et je ne suis pas en mesure de trouver une solution. J'ai vérifié tous les articles recommandés par Microsoft et également d'autres développeurs. Cette approche semble fonctionner pour tout le monde et je ne peux pas comprendre ce que je fais mal. Si quelqu'un peut aider, je l'apprécierais vraiment. PS: Ce code peut ne pas fonctionner car c'est seulement à des fins d'illustration. mais c'est exactement ce que je fais dans mon code.ViewState ["sample"] Variable ne retenant pas la valeur sur la publication dans un contrôle composite

Public class Test : CompositeControl 
{ 
    private Button btnTest = new Button(); 
    public string TestViewState 
    { 
     get 
     { 
      string s = (string)ViewState["test"]; 
      return (s == null) ? String.Empty : s; 
     } 
     set 
     { 
      ViewState["test"] = value; 
     } 
    } 

    private void set() 
    { 
     TestViewState = "test"; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if(!Page.IsPostBack) 
      set(); 
    } 

    protected override void RecreateChildControls() 
    { 
     EnsureChildControls(); 
    } 

    protected override void CreateChildControls() 
    { 
     base.Controls.Clear(); 
     btnTest.ID = "btnTest"; 
     btnTest.Click += new EventHandler(btnSubmitTest_Click); 

     if (!ChildControlsCreated) 
     Controls.Add(btnTest);  

     base.CreateChildControls(); 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     btnSumbit.Render(writer); 
    } 

    protected void btnSubmitTest_Click(object sender, EventArgs e) 
    { 
     string test = TestViewState; // Viewstate value is null here!!!!!! 
    } 
} 
+0

J'ai oublié de mentionner que ce contrôle est appelé à partir d'un autre contrôle composite .. peut-être que les données de contrôle enfant ne sont pas conservées dans viewstate. – user479843

Répondre

0

Etes-vous sûr que Page_Load est appelé? Pour autant que je me souvienne que cette "notation" ne fonctionne que sur les pages et les contrôles utilisateur (n'a pas vérifié cela). Essayez de surcharger:

protected override void OnLoad(EventArgs e) 
{ 
    ... 
} 

Testez-le avec un débogueur.

+0

Oui, ça s'appelle. En fait, la page_load est appelée depuis la page où se trouve ce contrôle. Je l'ai mis ici à des fins d'affichage. J'ai également vérifié que la page_load fonctionne aussi à l'intérieur du contrôle. J'ai fait une erreur en disant que ce contrôle personnalisé est un enfant d'un autre. En fait, cela est utilisé directement à partir d'une page aspx. – user479843

+0

J'ai testé votre code maintenant avec un site Web ASP.NET. Page_Load n'a pas été appelé **, OnLoad (...) a été appelé. En déplaçant set() sur OnLoad (...) tout fonctionne bien – Arthur

+0

ok, il semble fonctionner quand j'ai essayé avec ce code, même avec le chargement de la page (dans la page actuelle) .. donc, il doit y avoir quelque chose sur mon réel contrôle ... je vais regarder plus loin. Merci de vérifier cela. – user479843

0

Ok, le enableviewstate a été désactivé au niveau web.config par un autre membre de l'équipe. Content de l'avoir trouvé. Merci Arthur de confirmer que ça a marché pour vous.

+0

Oh - un de ces "gentils" bugs ;-) – Arthur