C'est normal, c'est lié au fonctionnement du ViewState.
Fonctionnement normal :
- Chaque controle a un ID.
- Au PostBack, les velurs de chaque contrôle sont sauvées dans le ViewState, identifiée par cet ID.
- A la re-création de la page, ASP.Net parcours l'arbre des contrôle, et rempli, avec les données du ViewState, ceux dont il reconnait l'ID.
Dans ton cas :
- Tes TextBoxes sont bien sauvées dans le ViewState.
- Elles sont identifiées dans le ViewState par leur ID.
- A la re-création de la page, ASP.Net ne trouve pas tes textboxes et ne peut pas les remplir.
Solution :
1 - Il faut les recréer à la main à chaque Page_Load()
2 - Il faut forcer leur ID si tu veux être sûr qu'il soit le même d'un postback à l'autre.
3 - Il faut stocker ces ID entre les psotback (dans le ViewState par exemple)
Code :
- private void Page_Load(object sender, System.EventArgs e)
- {
- // Essaye de récupérer les textboxes existantes dans le ViewState
- object data = ViewState["myTextBoxes"];
- if(data != null)
- {
- // on cast tout ça en tableau de chaînes
- string []myIDs = (data as string []);
- if(myIDs != null)
- {
- // pour chaque chaine
- foreach(string ID in myIDs)
- {
- // créer la txtbox
- TextBox txt = new TextBox();
- // lui forcer son ID
- txt.ID = ID;
- // et la rajouter au PlaceHolder
- this.PlaceHolder1.Controls.Add(txt);
- }
- }
- }
- }
- // Le code du bouton 'Ajouter'
- private void Button1_Click(object sender, System.EventArgs e)
- {
- // Créer la textbox
- TextBox txt = new TextBox();
- // Lui donner un ID arbitraire et unique
- txt.ID = "textbox"+this.PlaceHolder1.Controls.Count;
- // La rajouter au placeHolder
- this.PlaceHolder1.Controls.Add(txt);
- ArrayList list = new ArrayList();
- // Pour chaque control dans ce place holder
- foreach(Control ctrl in this.PlaceHolder1.Controls)
- {
- // Si c'est une textbox
- TextBox mytxt = ctrl as TextBox;
- if(mytxt != null)
- // le rajouter dans la liste des IDs à sauver
- list.Add(mytxt.ID);
- }
- // Mettre à jour le contenu du ViewState
- ViewState["myTextBoxes"] = (string [])list.ToArray(typeof(string));
- }
|