[C# .NET 2.0] Un contrôle ajouté disparaît qd on reload la page

Un contrôle ajouté disparaît qd on reload la page [C# .NET 2.0] - C#/.NET managed - Programmation

Marsh Posté le 09-01-2007 à 22:45:27    

Bonjour à tous :)
 
Voici ce que mon code fait :  
- au chargement de la page .aspx, il ajoute un label à "myDiv" (qui est un <div runat="server /> )
- qd j'appuie sur le bouton, le label disparaît. Or, je ne veux pas qu'il disparaisse...
Voici mon code, très simple :  

Code :
  1. protected void Page_Load(object sender, EventArgs e)
  2.   {
  3.     if (!IsPostBack)
  4.     {
  5.       AddLabel();
  6.     }
  7.   }
  8.   protected void myButton_Click(object sender, EventArgs e)
  9.   {
  10.   }
  11.   private void AddLabel()
  12.   {
  13.     Label label = new Label();
  14.     label.Text = "myLabel";
  15.     myDiv.Controls.Add(label);
  16.   }


Comment puis-je faire pour que le label ajouté ne disparaisse pas qd j'appuie sur le bouton ?  
Merci beaucoup :)

Reply

Marsh Posté le 09-01-2007 à 22:45:27   

Reply

Marsh Posté le 09-01-2007 à 22:46:41    

Leaky Abstraction, 2ème partie :D

Reply

Marsh Posté le 09-01-2007 à 22:47:44    

Il ressemble à quoi, le code HTML généré ?

Reply

Marsh Posté le 09-01-2007 à 23:14:53    

Coucou :)
 
ça veut dire quoi "leaky abstraction" ?  
Sinon, le code généré pour le label ajouté est :  

Code :
  1. <span>myLabel</span>


Pourquoi tu veux savoir ça ?  :??:  
Merci bien en tout cas si tu peux m'aider :)

Reply

Marsh Posté le 09-01-2007 à 23:18:31    

Nan mais le reste et tout. Parce que là tu insère le label si !postback, donc forcément quand tu cliques sur le bouton ça va postbacker, donc pas de label insérer.
 
Leaky Abstraction, parce que ASP.NET fait tout pour toi, et donc souvent des trucs simples à faire avec le langage en-dessous (HTML) peut tout à coup devenir compliqué ou pas clair parce que tu ne manipules pas directement l'HTML.
 
Un truc du style Button_Click est un non-sens total en terme de web : d'un point de vue du langage HTML ou du protocole HTTP, on ne clique jamais sur un bouton. En fait, on envoie une requête à une certaine URL avec quelques informations. Tu suis ? :D

Reply

Marsh Posté le 10-01-2007 à 00:07:09    

Le if (!IsPostBack) est fait exprès, parce que je ne veux à avoir à rajouter la Label à chaque fois.  
Je comprends bien pourquoi il s'en va à chaque reload, mais j'aimerais bien trouver un moyen pour qu'il persiste.  
EnableViewState=true ne change rien... je me demande si je ne dois pas utiliser un ViewState et y mettre le contenu du <div>, et à chaque reload je re-remplis le <div> avec le ViewState. C'est moche hein ?  
 
Je te donne le code HTML généré au premier chargement (le label est bien là)  

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head><title>
  4. Untitled Page
  5. </title></head>
  6. <body>
  7.   <form name="form1" method="post" action="test.aspx" id="form1">
  8. <div>
  9. <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTExMzQwOTM4NTJkZA==" />
  10. </div>
  11.     <div id="myDiv"><span>myLabel</span></div>
  12.     </div>
  13.     <input type="submit" name="myButton" value="Run" id="myButton" /> 
  14.   </form>
  15. </body>
  16. </html>

Mais je ne comprends tjs pas pourquoi tu as besoin de ce code :)
Merci bien en tout cas pour ton aide, et si tu trouves une solution...  :lol:

Message cité 1 fois
Message édité par Roodie le 10-01-2007 à 00:07:32
Reply

Marsh Posté le 10-01-2007 à 11:13:26    

Roodie a écrit :

Le if (!IsPostBack) est fait exprès, parce que je ne veux à avoir à rajouter la Label à chaque fois.


Tu es obligé de le faire, sinon il s'affichera pas. Que la page soit appellée en get ou en post, il faut la regénérer entièrement

 
Roodie a écrit :

Mais je ne comprends tjs pas pourquoi tu as besoin de ce code :)


Parce que c'est le plus important : tout la tambouille d'asp.net sert à générer du code HTML sans trop se prendre la tête. Maintenant s'il génère n'importe quoi, c'est normal que ça marche pas :) Donc parfois le mieux est de voir ce qui sort


Message édité par FlorentG le 10-01-2007 à 11:13:39
Reply

Marsh Posté le 10-01-2007 à 14:18:19    

Snif, je ne peux pas faire ce que j'espérais alors :(
Bin si qqn a une idée :)
Merci bcp à toi en tout cas :)

Reply

Marsh Posté le 10-01-2007 à 23:00:50    

Coucou :)
 
Voici une solution à mon problème. Pas aussi bien que je ne l'espérais mais bon...

Code :
  1. // add label
  2. Label label = new Label();
  3. label.Text = "myLabel";
  4. myDiv.Controls.Add(label);
  5. // get myDiv content
  6. StringBuilder sb = new StringBuilder();
  7. HtmlTextWriter textWriter = new HtmlTextWriter(new StringWriter(sb));
  8. myDiv.RenderControl(textWriter);


Tu l'as compris, j'utilise "RenderControl()" pour récupérer le contenu de "myDiv", puis ensuite j'utiliserai le ViewState pour récharger le contenu à chaque fois...  
 
Merci encore bcp de ton aide :)

Reply

Sujets relatifs:

Leave a Replay

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