2009-10-09 9 views
0

J'ai un conteneur d'onglets ajax toolkit sur ma page ASP.Net, et je crée dynamiquement les onglets dans le code (à l'exécution, j'ai un nombre variable de onglets, chacun avec la même mise en page mais avec des données d'en-tête et de corps différentes). Chaque onglet contient un seul contrôle, un contrôle utilisateur que j'ai créé pour que tous les onglets aient la même apparence. Dans le contrôle de l'utilisateur est un autre contrôle utilisateur que j'ai construit pour gérer la pagination de mes données dans l'onglet. Ce contrôle utilisateur de pagination a une propriété qui est sauvegardée dans ViewState.Problèmes de rechargement de viewState de mes contrôles ASP.Net créés dynamiquement

Je lie toutes les données pour les onglets dans une seule fonction BindData sur la page ASPX. Au sein de cette fonction, je définis toujours un ID pour mes contrôles créés dynamiquement et les ajoute à leurs contrôles de conteneur avant de définir d'autres propriétés, de câbler des événements ou de lier des données à ceux-ci.

Je suis en train de perdre la valeur de la variable ViewState dans mon contrôle utilisateur d'échange dans ce scénario:

page ASPX

Page_Init: 

    If IsPostBack Then 
     BindData  ' Recreates the control tree on postback. 
     ' ViewState is loaded successfully here. 
    End If 

Page_Load: 

    If Not IsPostBack Then 
     BindData() ' Bind the initial data. 
    End If 

[Some event that happens after Page_Load in response to clicking on my user control]: 

    ... 
    BindData() ' Controls recreated with changed data but same IDs as in Page_Init. 
    ' ViewState does not get loaded back into my control tree. 

Dois-je attendre pas le ViewState pour obtenir à nouveau chargé sur la deuxième version de mon arbre de contrôle dans le cycle de vie de la page?

Répondre

2

Après plusieurs lectures, il semble que les contrôles dynamiques créés après la phase d'initialisation ne chargent pas ViewState. Pour ma situation, dans ma fonction BindData, j'attrape mes valeurs viewstate aux variables locales, recréer les contrôles, puis réinitialiser les valeurs viewstate. Cela semble fonctionner.

+0

Avez-vous essayé de vous brancher le contrôle de code de création en pré-init? JUst pour voir si cela vous évite de réattribuer manuellement les valeurs de viewstate. Bien que vous l'ayez déjà fait fonctionner :) –

+0

Le problème est dans ASP.NET il oublie l'état d'affichage dès qu'il a été lié une fois. Cela se produit après init mais avant le chargement. L'état d'affichage ne peut pas être lié deux fois au cours de la même requête, même si vous recréer exactement le même arbre de contrôle. Annyoing, oui! –

0

Vous devez créer les contrôles dynamiques en phase pré-init. Et recréez-les même après la publication. Vérifiez les détails du cycle de vie de la page ici: http://msdn.microsoft.com/en-us/library/ms178472.aspx

+0

Je recréer mes contrôles dynamiques dans la phase Init (j'ai vérifié l'article et le chargement de ViewState vient après Init, donc cela ne semble pas important si les contrôles dynamiques sont créés dans PreInit ou Init), y compris après un postback . Tout cela fonctionne bien. Lorsque je crée à nouveau les contrôles après que mes gestionnaires d'événements de contrôle se déclenchent, je perds mon ViewState. –

Questions connexes