[RESOLU][ASP/NET] Construire un formulaire dynamique dans un wizard

Bonjour,
Je travaille sur une application ASP/NET qui consomme les Webservices Business.Object (Mon premier projet en ASP.NET et en C# et en WebService… Je cumule :stuck_out_tongue: ) .
J’utilise l’objet wizard avec 2 etapes pour le moments.

Dans la 1ere etape (‹ document ›): je liste des documents BO que l’utlisateur peut sélectionner

Dans la 2eme étape (‹ valeur ›) : j’affiche la liste des ‹ promts › (valeur saisie pour rafraichir les documents) que l’utilisateur doit renseigner en fonction des documents sélectionnés.

Pour ce faire : dans l’evenement IndexStepchanged, je crée les prompts dans une boucle qui analyse les documents BO sélectionnés et les prompts qu’ils necessitent (sachant qu’un prompt peut se retrouver sur x document, je ne le demande qu’une fois) :

[code]

foreach (PromptInfo boPromptInfo in boDocInfo.PromptInfo)
{
if (Valeurs.FindControl(« tb » + boPromptInfo.Name) == null)
{
Label txtlabel = new Label();
TextBox txtLastName = new TextBox();
Label txtclabel = new Label();
txtlabel.Text = boPromptInfo.Name + " ";
Valeurs.Controls.Add(txtlabel);

									txtLastName.ID = "tb" + boPromptInfo.Name;
									txtLastName.Text = ((BusinessObjects.DSWS.ReportEngine.DiscretePromptValue)(boPromptInfo.PreviousValues[0])).Value.ToString();
									Valeurs.Controls.Add(txtLastName);
									
									txtclabel.Text = " <br />";
									Valeurs.Controls.Add(txtclabel);
									index = index + 1;
								}
							}[/code]

Tout semble fonctionner (affichage des controles). Mais quand je recherche les valeurs saisies dans l’evenement ‹ FinishButtonClick ›. Le StepWizard ‹ Valeur › ne contient plus les controles dynamiques créés dans l’événement IndexStepChanged.
Comme j’accede au control statique crée via le designer… j’ai tendance à penser que je m’y prend fichtrement mal pour déclarer ces controles dynamiques…Conseil/Avertissement/information sont les bienvenus

merci

:stuck_out_tongue: (apres je laisse mourrir ce thread)

Achetes le bouquin de Fritz Onion et apprend par coeur le chapitre sur la Page Lifecycle :stuck_out_tongue: ce genre de trucs t’arrivera moins. Sinon la comme ca a froid sans creuser c’est pas trivial.

Il faut que tu recrées les controles dynamiquement ajoutés à ta page dans le “CreateChildControls”. Il suffit que tu leur donne le même ID que celui rentré à la base, et si le viewstate est activé, il sera réapliqué, et les évènements de ces boutons seront déclenchés.

exact, en gros il faut que tu “construises” tes controls à chaque pageLoad.

Merci ,
ca va tout de suite mieux…

Comme il y a beaucoup de moyen de faire un truc (mais qu’il y a peu de bonne solution), je vous mets comment j’ai implémenté ca avec un variable de session

controlValeurs qui est un tableau de control (ca ne me plait pas trop,surtout que ce n’est pas un tableau dynamique, mais j’ai pas trouvé mieux pour le moment)

Donc dans le PageLoad

[code]
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
// plein de jolie code
}
else
{
if ((Control[])Session[“controlValeurs”] != null)
{
ControlValeurs=(Control[])Session[“controlValeurs”];
for (int i = 0; i < ControlValeurs.GetLength(0); i++)
{
if (ControlValeurs[i] != null)
{ Valeurs.Controls.Add(ControlValeurs[i]); }
}
}
}

}[/code]

dans le ActiveStepChanged

[code] protected void Wizard_ActiveStepChanged(object sender, EventArgs e)
{
switch (WizardBO.ActiveStepIndex)
{
case 0:
//plein de jolie code
break;
case 1:
//…
// code pour la boucle de gestion des prompts ajouté au step ‘Valeur’
//…
{
Label ChampLabel = new Label();
TextBox ChampTextBox = new TextBox();
Label RetourLigneLabel = new Label();
RetourLigneLabel.Text = “
”;
ChampLabel.Text = boPromptInfo.Name + " ";
Valeurs.Controls.Add(ChampLabel);
ChampTextBox.ID = “tb” + boPromptInfo.Name;
ChampTextBox.Text = ((BusinessObjects.DSWS.ReportEngine.DiscretePromptValue)(boPromptInfo.PreviousValues[0])).Value.ToString();
Valeurs.Controls.Add(ChampTextBox);
Valeurs.Controls.Add(RetourLigneLabel);
}
//…
//en sortie de boucle
// je sauvegarde mes controles dans la variable de session
//…

		   int Index = 0;
			foreach (Control Ctrl in Valeurs.Controls)
			{
				ControlValeurs[Index] = Ctrl;
				Index++;
			}
			Session["ControlValeurs"] = ControlValeurs;[/code]