Question

Supposons que j'ai un TreeView, où chaque treenode contient un identifiant pour un ensemble différent de contrôles utilisateur. Lorsque l'utilisateur clique sur un nœud, ces contrôles doivent être chargés à la page. Si je comprends bien le cycle de vie de la page ASP, les contrôles dynamiques devraient être ajoutés dans la phase d'initialisation, et les événements postback se déclenche plus tard.

Donc, si l'événement click treeview se produit après que je dois ajouter mes commandes, comment puis-je ajouter dynamiquement des contrôles en fonction des événements postback utilisateur?


Edit: J'ai essayé la suggestion de ArronLS:

Ce que je faisais était ajouter la valeur de nœud à la matrice de session, et l'utiliser quand je fais l'init pour choisir les éléments sous forme de charge aux commandes d'un contrôle de l'espace réservé. En cas de clic treeview, mettre à jour le noeud dans le tableau de la session, les éléments anciens effacer forment dans l'espace réservé, et ajouter les nouveaux éléments de formulaire aux commandes. Lorsque la page est à nouveau chargé, il doit maintenant trouver le nœud au moment init, seraient contournées problèmes si viewstate.

Maintenant, je ne l'ai pas encore testé complètement, mais il y avait un autre similaire poster qui parle des problèmes qui pourraient résulter de l'état d'affichage. Ils suggèrent une solution que les sondages la demande [] partie du contexte (dans leur cas, la boîte de transfert) dans le contrôle Init, la manipulation manuellement certaines des fonctionnalités de publication.

Ma nouvelle question est comment j'accéder au nœud sélectionné dans l'arborescence à l'aide du tableau de demande?

Était-ce utile?

La solution

La conséquence de ne pas charger les contrôles dans init est que s'il y a des changements aux propriétés dans l'état d'affichage, ceux-ci ne seront pas persisté aux contrôles. Par exemple, si la première demande de la page, vous créez dynamiquement des contrôles dans init, puis sur le poste arrière vous les créez à nouveau dans init, puis après initialisation, toutes les valeurs de propriété dans viewstate s'appliquer au contrôle.

Donc, si vous avez créé le contrôle dans un premier temps un événement click treeview, je suppose que cela devrait être bien, car il n'y a pas encore de viewstate accumulée à appliquer au contrôle car il vient d'être créé. Cependant, je ne suis pas sûr que cela entraînera le contrôle pour ne pas enregistrer viewstate. Il faudrait expérimenter cela.

postbacks ultérieurs après la première, maintenant, vous devez créer le contrôle dans initialisation pour viestate accumulée à appliquer, de sorte que vous aurez besoin d'un mécanisme pour « rappeler » que vous avez créé le contrôle une fois, d'abord en réponse à l'événement de clic, puis sur postbacks ultérieures créer à nouveau le contrôle d'initialisation. Vous devez recréer le contrôle sur chaque demande, si vous ne saviez pas.

La question est de savoir comment important est le viewstate pour le contrôle.

Edit: Je vais aussi ajouter que je ne suis pas tout à fait sûr que s'il y aurait autre conséquence autre que la façon dont cela affecte viewstate

.

Autres conseils

Cela peut ne pas être une réponse à votre question directement, mais comme je ne l'ai jamais trouvé une réponse moi-même, voici la solution que je l'ai utilisé.

L'approche que je l'ai toujours utilisé lorsque l'on travaille avec un TreeView est de déclarer les contrôles dans la page ASPX une fois, puis sur l'événement click, lier les contrôles des données basées sur l'ID. Si nécessaire, vous pouvez définir d'abord la visibilité de visible = « false » et le changer quand il est lié. Cette approche fonctionne bien, car il évite simplement l'énigme que vous décrivez.

Si vous n'êtes pas opposé à renoncer à arborescences, répéteur imbriqué travaux d'approche bien, aussi.

Il suffit de jeter une autre pensée, dans l'espoir d'obtenir un peu plus de commentaires ...

Je pourrais utiliser l'événement postback pour définir la valeur sélectionnée dans le tableau de session, puis forcer la page rediriger vers lui-même. Ensuite, init que l'utilisateur voit sera effectivement fait après le gestionnaire d'événements a tiré.

On dirait une mauvaise idée, donc j'espère autre chose.

Si je vous ai bien compris, vous voulez un contenu différent indiqué pour chaque noeud d'arborescence. Je suppose Theres la vue arborescente sur la gauche et une zone de contenu au milieu.

Du point de vue de l'interface utilisateur je résous normalement cela en utilisant un MultiView où chaque individu View est un usercontrol séparé avec le contenu requis. L'événement de clic treenode change simplement la activeIndex MultiView contenue dans la propriété de valeur de nœud (ID est stocké dans le DataItem) et que vous passez simplement la zone de contenu.

En général, même si les nœuds d'arbre sont générées dynamiquement, à partir des données par exemple, il n'y aura que jamais une quantité finie de « noeud » Voir usercontrols que vous devez définir.

Note. Soyez prudent lorsque vous utilisez le contrôle MultiView que toutes les vues contenues sont chargés pendant le cycle de vie pages alors ne mettez pas « lourds de levage » dans Page_Load etc.

Il peut être utile de se rappeler que l'ID du noeud sélectionné est passé comme une valeur de forme, ce qui est toujours accessible à partir de la collection de Request.Form, même lors de l'événement Init. La clé serait quelque chose comme ctl00_Content1_TreeView1_SelectedNode. Cependant, cet ID seul ne serait probablement pas vous obtenir la valeur dont vous avez besoin, donc vous voulez regarder Request.Form["__EVENTARGUMENT"] et également utiliser Request.Form["__EVENTTARGET"] pour vérifier qu'il était bien le TreeView qui a provoqué la publication.

Plus que probablement les informations dont vous avez besoin peut être retiré de la collection de formulaire. Il est juste une question de mettre un point d'arrêt et d'examiner les valeurs. Ce genre de code se sent toujours terriblement hacky mais dans ce cas vous ne pouvez pas attendre l'événement du contrôle TreeView à traiter lorsque vous avez besoin d'utiliser les valeurs présentées sous la forme de faire quelque chose pendant Page_Init. Il suffit de ne pas avoir peur de regarder les valeurs du formulaire au lieu d'attendre .NET pour empaqueter tout bien avec des propriétés fortement typées. D'ici là, il sera trop tard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top