2010-09-30 6 views
1

Je comprends l'ordre dans lequel les événements se produisent avec le cycle de vie de la page, mais cela n'aide pas ma situation. J'ai une liste de cases à cocher qui est remplie par un répertoire rempli de formulaires. Lorsque je coche une case à côté du nom du formulaire, je voudrais créer dynamiquement une étape de l'assistant et insérer le formulaire.Impossible d'obtenir des valeurs dans l'événement OnInit

Ordre des événements: OnInit: GatherForms() - Répertoire des chèques et charges tous les noms de formulaire dans la case LoadForms() - Contrôles "sélectionnés" session et charge des formes qui ont été recueillies

CheckBoxList: SelectedIndexChanged #AutoPost = true # PopulateForms() - Fait une boucle sur les cases à cocher et les ajoute à l'état de session

Lorsque l'utilisateur clique sur la case à cocher, il effectue une publication et frappe l'OnInit qui tire de la session. Le problème est que PopulateForms() n'a pas encore été lancé, donc il n'a rien peuplé même s'il est vérifié. Si je clique sur un autre élément, il sera publié et apparaîtra. Je ne peux pas sembler être en mesure de tirer toute sorte d'informations utiles de la case à cocher avant l'actualisation, ce qui signifie que je ne peux pas voir les formes apparaissent immédiatement. J'ai également essayé de boucler la case mais malheureusement viewstate n'a pas encore posté. soupir.

Des suggestions?

Merci! P.S: Je ne peux pas utiliser Request.Form [] parce que je dois sortir tous les éléments sélectionnés de la case à cocher. peut-être que je peux mais je ne peux pas trouver un moyen:/

Répondre

1

Il s'agit d'un problème courant auquel je me bats au fur et à mesure que je m'améliore avec ASP.NET.

Avec les contrôles dynamiques, le problème est qu'ils n'existent pas réellement pendant OnInit.

Ce que vous pouvez faire est de créer tous des contrôles que l'utilisateur peut voir pendant OnInit, et masquer les éléments que l'utilisateur ne verra pas dans le code. La page se chargera, tous les contrôles possibles seront instanciés (dans le code - ne vous inquiétez pas que cela apparaisse dans votre code HTML et le ballottent), le gestionnaire d'événements se déclenchera, et vous pourrez gérer la visibilité de votre assistant.

Par exemple:

public void OnInit(object sender, EventArgs e) 
{ 
    GatherForms(); 
    CreateWizardForm(); // creates a wizard and adds controls it will need 
} 

private void Checkbox_Checked(object sender, EventArgs e) 
{ 
    var checkBox = (CheckBox)sender; 
    // append checkBox.SelectedValue to session state object of checkboxes 
} 

protected override void OnPreRender(object sender, EventArgs e) 
{ 
    if (/* Session checkboxes contain values */) 
    { 
     this.WizardForm.Visible = true; 
     this.CheckboxList.Visible = false; 
    } 
} 

Cela fonctionne à condition de savoir à l'avance qui contrôle sera sous la forme de l'assistant.Vous pouvez changer les valeurs de ces contrôles dans l'événement OnPreRender, basculer leur visibilité, etc, mais vous ne pouvez pas y aller et ajouter de nouveaux contrôles (par exemple Controls.Add (new Button())) - qui doit être fait dans le OnInit un événement.

+0

Merci pour vos commentaires, est-ce que ce serait le moyen le plus intelligent même si vous chargiez 100 formulaires? Serait-ce un gros coup de performance? Je ne sais pas combien de formulaires seront éventuellement ajoutés puisqu'ils peuvent les déposer dans un dossier. Tout cela est nouveau pour moi et semble être plus facile à mettre en œuvre. Aussi, comment puis-je coller du code dans ces forums? Merci! – Tony

+0

Votre idée combinée avec http://coales.net/post/2009/12/11/Optionally-hiding-steps-in-aspnet-Wiazard-control.aspx a facilité BEAUCOUP. Je vous remercie. – Tony

+0

100 formulaires peuvent être ou ne pas être un gros problème - cela dépend vraiment de votre scénario. Chaque fois que vous pouvez réutiliser des contrôles (et simplement modifier leurs étiquettes, valeurs et éléments de liste) est idéal, bien sûr, mais vous pouvez également rester bloqué avec un modèle de formulaire qui ne répond pas aux nouvelles exigences. Si vos formulaires sont simples et ne nécessitent pas tous des calculs complexes ou un aller-retour dans la base de données, ce n'est probablement pas une grosse affaire, sauf si vous traitez une grande quantité de trafic vers cette page. –

0

Un piège classique avec des contrôles dynamiques. Honnêtement, la meilleure solution est de simplement utiliser le tableau de valeurs Request pour rechercher les informations dont vous avez besoin et ignorer le cycle de vie pour cette situation particulière.

Dans OnInit(), les valeurs affichées sont là, elles n'ont pas encore été traitées par ViewState. Donc, vous pouvez simplement faire if (Request["myCheckBoxName"] == xxx) pour gérer les cases individuelles, ou si vous pouvez utiliser Request["__EVENTTARGET"] pour obtenir le nom du contrôle qui a causé la publication. Voir ma vieille réponse here pour une discussion plus approfondie du problème.

+0

Oui, cela a été un cauchemar. première fois que je travaille avec des contrôles dynamiques et j'ai déjà décidé que je ne les aime pas! J'ai essayé d'obtenir ce chargeur de forme simple travaillant pendant plus d'une semaine et demi et je me sens plus noob que je suis. je vous remercie pour le post je vais voir si je peux comprendre ce morceau de demande. Comment est-ce que je passerais en revue la liste de contrôle pour voir ce qui a été vérifié avec la demande? – Tony

+0

Vous devez essentiellement vérifier chaque valeur de case à cocher pour voir si elle a été validée. Les cases à cocher devraient avoir une sorte de schéma de nommage - si vous regardez les valeurs de la demande dans le débogueur, il devrait être clair comment analyser les noms de ceux qui ont été vérifiés. – womp

+0

Ok, donc je l'ai maintenant travailler en utilisant le EVENTTARGET qui me permet d'écrire 2 événements de charge différents qui est ce dont j'avais besoin. Maintenant, mon problème est qu'il se trompe lorsque je clique sur une case à cocher et l'enlever. Donne moi une erreur viewstate. Je vais continuer à travailler sur cette pièce aujourd'hui, mais peut-être que vous verrez et erreur avant que je passe toute la journée à travailler dessus hehe. Merci pour l'aide. Doh, mal faire un nouveau message pour montrer le code. – Tony

1

Ajoutez uniquement vos contrôles dynamiques dans OnInit. Ne faites aucune population/traitement jusqu'à PageLoad. Vous conserverez vos valeurs de cette façon.