2009-10-02 8 views
1

J'essaie de charger un contrôle en fonction d'un ID de catégorie sélectionné dans une liste déroulante.Pourquoi mon état d'affichage ne stocke-t-il pas un contrôle dynamique à l'aide de Controls.Add?

C'est ce code que j'ai dans une instruction switch pour montrer un usercontrol. C'était la seule façon de le faire et d'avoir des vues réutilisables. Je suis ouvert à d'autres méthodes que j'ai lu quelques personnes disant d'éviter le chargement dynamique?

var control = Page.LoadControl("~/usercontrols/aCertainForm.ascx"); 
exampleDivArea.Controls.Add(control); 

Au moment de son chargement bien sur un bouton clic qui appelle le code ci-dessus, mais quand je Postback à la même forme à nouveau, il perd son état pour le contrôle dynamique.

Merci pour vôtre réponses à l'avance, je l'apprécie et je l'espère bientôt je serai en mesure d'aider les autres beaucoup plus :)

Répondre

1

Le code ci-dessus doit être exécuté au début du cycle de vie de la page, de sorte que ASP .NET peut alors restaurer son état. Le gestionnaire d'événements côté serveur pour un événement de changement de liste déroulant se produit après que tous les états ont été restaurés, et il sera donc trop tard. Vous devez ajouter le code à Init ou quelque part comme ça.

(Oui, cela est très laid, et casse vraiment toute abstraction ASP.NET, comme beaucoup de choses font. :-) Désolé

+0

au moment où le poste ne marche pas dropdown automatique en arrière, mais le bouton sous elle change la vue MultiView – Andrew

+0

OK, alors que gestionnaire d'événements bouton doit avoir un code qui non seulement modifie le multiview (pour cette requête), mais stocke également ViewState qui est également lu au début du cycle de vie de la page pour définir le multiview. – spookylukey

0

Après avoir chargé le contrôle, l'assigner est id. Ce code doit s'exécuter sur l'affichage initial et sur la publication. Et assurez-vous que l'identifiant utilisé est le même.

Voici le code que j'utiliserais dans Page_Load:

var control = Page.LoadControl("~/usercontrols/aCertainForm.ascx"); 
control.id = "ACertainFormControl01"; 
exampleDivArea.Controls.Add(control); 

if (IsPostBack) 
{ 
    do stuff 
} 
else 
{ 
    do stuff 
} 
Questions connexes