probleme avec les placeholder

probleme avec les placeholder - C#/.NET managed - Programmation

Marsh Posté le 28-10-2005 à 15:39:28    

Bonjour,  
j'ai un petit soucis avec des composants créés dynamiquements.  
En fait, je veux que l'utilisateur puisse saisir un nombre indéfinit de textbox. (en vrai c'est pas des textbox mais le principe doit etre le meme)  
A chaque fois qu'il clique sur un bouton "ajouter" un noueau textbox doit apparaitre en conservant les anciens.  
Si jamais l'utilisateur clique deux fois, ca marche plus. En fait, il pert chaque textbox deja créer ainsi que la valeur de ce textbox.  [:iana]  
Comment faire pour qu'il reste présent.  
Merci d'avance

Reply

Marsh Posté le 28-10-2005 à 15:39:28   

Reply

Marsh Posté le 28-10-2005 à 16:13:50    

Tu dois ajouter tes contrôles à la collection de contrôles enfants de ton contrôle parent

Reply

Marsh Posté le 28-10-2005 à 16:18:19    

heu c'est à dire ?
je comprend pas trop

Reply

Marsh Posté le 28-10-2005 à 16:27:25    

placeholder.Controls.Add(new TextBox())
 
(enfin preque quoi, il faudra configurer la textbox aussi).


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-10-2005 à 16:52:31    

c'est exactement ce que je fais. Puis qd je reload la page pour rajouter encore un texbox il perd celui juste avant

Reply

Marsh Posté le 28-10-2005 à 16:53:51    

pkoi reload ? tu parles du postback ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-10-2005 à 16:58:36    

j'ai un bonton "ajouter" qui devrai permettre à chaque click créer un nouveau textbox. Donc c'est un postback.

Reply

Marsh Posté le 28-10-2005 à 17:01:20    

c pas une histoire de viewstate ??

Reply

Marsh Posté le 28-10-2005 à 17:04:38    

voila le code  

Code :
  1. private void Page_Load(object sender, System.EventArgs e)
  2.  {
  3.   // Placer ici le code utilisateur pour initialiser la page
  4.  }
  5. private void btNew_Click(object sender, System.EventArgs e)
  6.  {
  7.   nb=nb+1;
  8.   Response.Write(nb.ToString()); 
  9.   TextBox r=new TextBox();
  10.   r.ID="test"+nb.ToString() ;
  11.   r.EnableViewState=true;
  12.   RadParagraphe.Controls.Add(r);
  13.  }

Reply

Marsh Posté le 28-10-2005 à 17:04:45    

on peut voir le code ?
 
titione > non pas là dessus, le truc par défaut suffit.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-10-2005 à 17:04:45   

Reply

Marsh Posté le 28-10-2005 à 17:05:31    

t'as pas de on_init ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-10-2005 à 17:06:59    

et voili le on_init  

Code :
  1. override protected void OnInit(EventArgs e)
  2.  {
  3.   //
  4.   // CODEGEN : Cet appel est requis par le Concepteur Web Form ASP.NET.
  5.   //
  6.   InitializeComponent();
  7.   base.OnInit(e);
  8.  }

Reply

Marsh Posté le 28-10-2005 à 17:08:18    

et InitializeComponent ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-10-2005 à 17:11:31    

il y a plus rien apres ca ;-)

Code :
  1. private void InitializeComponent()
  2.  {   
  3.   this.btNew.Click += new System.EventHandler(this.btNew_Click);
  4.   this.Load += new System.EventHandler(this.Page_Load);
  5.  }


Message édité par schmur le 28-10-2005 à 17:12:56
Reply

Marsh Posté le 28-10-2005 à 17:19:11    

tu peux virer le r.enableViewstate stp ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 28-10-2005 à 17:55:54    

on y vient... ;)

Reply

Marsh Posté le 29-10-2005 à 02:50:25    

j'avais essayer sans au debut.
Puis j'ai mis a true et à false sans resultat. Ca viens pas de la

Reply

Marsh Posté le 31-10-2005 à 08:58:25    

pas d'autre idée ?

Reply

Marsh Posté le 01-11-2005 à 12:23:01    

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 :
  1. private void Page_Load(object sender, System.EventArgs e)
  2. {
  3. // Essaye de récupérer les textboxes existantes dans le ViewState  
  4. object data = ViewState["myTextBoxes"];
  5. if(data != null)
  6. {
  7.  // on cast tout ça en tableau de chaînes
  8.  string []myIDs = (data as string []);
  9.  if(myIDs != null)
  10.  {
  11.   // pour chaque chaine
  12.   foreach(string ID in myIDs)
  13.   {
  14.    // créer la txtbox
  15.    TextBox txt = new TextBox();
  16.    // lui forcer son ID
  17.    txt.ID = ID;
  18.    // et la rajouter au PlaceHolder
  19.    this.PlaceHolder1.Controls.Add(txt);
  20.   }
  21.  }
  22. }
  23. }
  24. // Le code du bouton 'Ajouter'
  25. private void Button1_Click(object sender, System.EventArgs e)
  26. {
  27. // Créer la textbox
  28. TextBox txt = new TextBox();
  29. // Lui donner un ID arbitraire et unique
  30. txt.ID = "textbox"+this.PlaceHolder1.Controls.Count;
  31. // La rajouter au placeHolder
  32. this.PlaceHolder1.Controls.Add(txt);
  33. ArrayList list = new ArrayList();
  34. // Pour chaque control dans ce place holder
  35. foreach(Control ctrl in this.PlaceHolder1.Controls)
  36. {
  37.  // Si c'est une textbox
  38.  TextBox mytxt = ctrl as TextBox;
  39.  if(mytxt != null)
  40.   // le rajouter dans la liste des IDs à sauver
  41.   list.Add(mytxt.ID);
  42. }
  43. // Mettre à jour le contenu du ViewState
  44. ViewState["myTextBoxes"] = (string [])list.ToArray(typeof(string));
  45. }

Reply

Marsh Posté le 18-10-2006 à 14:33:59    

Je ne suis pas certain que cette sauvegarde manuelle des ID soit obligatoire.
 
Je m'explique, j'ai justement un problème qui me fait dire le contraire.
 
J'ai deux pages ASP, avec un placeholder chacune. L'une d'elle ne perd rien au postback. (La proprièté controls contient bien les bonnes choses) alors que l'autre perd tout (il n'y a plus de placeholder au postback).
Pourtant les deux placeholder sont rempli de la même façon (meme fonction) et il n'y a pas plus de sauvegarde des ID dans la 1ere page que dans le 2ème.
Il y a quelque chose qui m'echappe mais ca marche quand même. Il faudrait que j'arrive à trouver pourquoi...
 
 
EDIT : Dans la premiere page la fonction de creation du placeholder était appellé à chaque postback. C'est pour cela qu'il etait toujours là. Il suffit donc de reattribuer les memes ID dans cette fonction et ca devrait marcher.


Message édité par drfrag le 18-10-2006 à 15:11:29
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed