IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[ASP.Net 2.0] asp:Button qui fait apparaître un autre asp:Button


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut [ASP.Net 2.0] asp:Button qui fait apparaître un autre asp:Button
    Salut à tous!

    Voilà mon problème résumé.

    J'ai un asp:Button. Quand on clique dessus mon code behind génère du XHTML pour l'injecter dans une Div par le biais d'un :
    Je cherche à injecter dans dans la Div un nouvel asp:Button. Comment fais-je ?

    J'ai naïvement essayé un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CodeInjecte += "<asp:Button runat=\"server\" ID=\"NouveauBouton\" OnClick=\"NouveauBouton_Click\" />";
    Mais évidemment...

  2. #2
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Bon. On m'a dit qu'un asp:Button était une classe et qu'il fallait l'instancier.

    Donc j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Button TestBouton = new Button();
                    TestBouton.ID = "TestBouton";
                    TestBouton.Text = "Pouet pouet";
                    TestBouton.Width = 60;
                    TestBouton.Click += new EventHandler(TestBouton_Click);
    Maintenant ce que j'ai besoin de savoir c'est comment préciser à quel endroit exact je veux placer ce bouton dans le code XHTML que génère mon code-behind.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonCodeXHTML += "<div>" + MonBoutonJeLeVeuxLà + "</div>";
    Merci à ceux qui sauront me répondre.

  3. #3
    Membre habitué Avatar de Mourad
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 152
    Points : 161
    Points
    161
    Par défaut
    tu devras mettre ton div "UnDiv" à runat="server" puis ajouter ton bouton aux controls du div comme ça :
    UnDiv.controls.Add(LeBouton) et c'est tout .
    tu ne peux pas ajouter dynamiquement le balisage d'un controle asp tu dois l'instancier et le manipuler en tant qu'objet.
    il n'y a pas de solution sans problème.

  4. #4
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Alors comme je ne serais pas au boulot avant lundi (alternance oblige) j'ai fait un petit test.

    Déjà je constate que pour insérer un bouton instancié il faut que la <div> soit déjà présente dans la partie XHTML (alors que ça m'aurait arrangé de pouvoir l'insérer dans une <div> générée, mais tant pis).

    Par contre j'ai un nouveau problème. Comme test j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
        protected void Page_Load(object sender, EventArgs e)
        {
            Texte.InnerHtml = "Commençons...";
        }
     
        protected void Start_Click(object sender, EventArgs e)
        {
            Texte.InnerHtml = "Continuons...";
            Button LetsGo = new Button();
            LetsGo.Text = "Lets' go";
            LetsGo.Width = 150;
            LetsGo.Click += new EventHandler(LetsGo_Click);
            DivBoutonDeux.Controls.Add(LetsGo);
        }
     
        protected void LetsGo_Click(object sender, EventArgs e)
        {
            Texte.InnerHtml = "It works!";
        }
    Et quand on clique sur le bouton LetsGo, le texte de la div Texte n'est jamais changé en "It Works!" A la place la page est rechargée à son état initial.

    Pourquoi?

  5. #5
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Tu devrais te renseigner sur ce que c'est qu'un PostBack.
    C'est une des bases de la programmation web.

  6. #6
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    A mon avis ton PB vient du fait que vu ke tu créer ton bouton dynamiquement, il te faut le recréer à chaque PostBack car il n'a pas de ViewState et du coup tu perd la liaison avec l'évenement click de ce bouton. c'est un sujet largement traité ici et sur le web.

  7. #7
    Membre habitué Avatar de Mourad
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 152
    Points : 161
    Points
    161
    Par défaut
    en d'autres termes l'affectation de l'eventhandler doit se faire dans le page_load
    il n'y a pas de solution sans problème.

  8. #8
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Non non, regardez la seule unique ligne de code dans le Page_Load.
    Il est évident le pb

  9. #9
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Je suis en train de me farcir ça, et ça semble passionnant. Je comprends qu'il faille que j'aprenne à maîtriser ces notions de PostBack et de ViewState mais...

    J'ai modifié mon Page_Load en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            Texte.InnerHtml = "Commençons...";
        }
    ...mais ça ne résoud toujours pas mon problème.

    Mose tu veux pas me dire une bonne fois pour toute ce qui ne va pas?

  10. #10
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Tiens bizare, ça semblait effectivement la solution, quoique je persiste avec ma solution à moi

    Sinon t'inquiète la solution est évidente pour Mose, il va te la donner

  11. #11
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par strat0
    J'ai modifié mon Page_Load en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            Texte.InnerHtml = "Commençons...";
        }
    ...mais ça ne résoud toujours pas mon problème.

    Mose tu veux pas me dire une bonne fois pour toute ce qui ne va pas?
    J'aime pas donner les solutions trop vite, je trouve ça mieux si tu cherches un peu, au moins tu apprends. La preuve, tu as trouvé tout seul

    Pour moi la solution évidente au pb du texte c'était bien le !(this.IsPostback) Maintenant, pour le pb du bouton c'est autre chose.

    Sinon, pour le bouton, je rejoins Guitoux : si tu le créé dynamiquement, il faut le recréer à chaque page_load. Du coup ça t'oblige à maintenir, dans le viewstate, un booléan pour savoir si son bouton doit être visible ou pas :
    Dans l'évènement :
    ViewState["MonBoutonEstVisible"] = true;
    Et dans le page_load :
    Tu consultes ce booléan pour savoir si tu créé le bouton ou pas.

    C'est pour cette raison qu'on fait généralement différemment : on fait un bouton caché (visible = false), qu'on rend visible dans l'évènement.
    Avantages :
    * la problématique du viewstate ne se pose pas, ton bouton est recréé à chaque fois vu qu'il est dans l'aspx.
    * L'état du bouton (visible o/n) est maintenu dans le ViewState automatiquement, donc pas besoin de faire autre chose que :
    monBouton.Visible = true dans l'évènement.

    Et oui, le web c'est chelou.

  12. #12
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Oui là forcément ça marche beaucoup mieux, et c'est effectivement plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            LabelTexte.Text = "Commençons...";
        }
     
        protected void Start_Click(object sender, EventArgs e)
        {
            LabelTexte.Text = "Continuons...";
            ButtonLetsGo.Visible = true;
        }
     
        protected void LetsGo_Click(object sender, EventArgs e)
        {
            LabelTexte.Text = "It works!";
        }
    Mais j'ai quand même l'impression de tricher un peu. (et je suis très très loin de ce que j'essayais de faire au départ : créer dynamiquement un bouton et l'ajouter dans du code XHTML généré côté code-behind)

  13. #13
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par strat0
    Mais j'ai quand même l'impression de tricher un peu. (et je suis très très loin de ce que j'essayais de faire au départ : créer dynamiquement un bouton et l'ajouter dans du code XHTML généré côté code-behind)
    Tu ne triches pas, tu fais la même chose qu'on fait dans des applis professionnelles
    Et sinon, tu peux faire ce que tu dis, mais il faut créer ton bouton dans le page_load.
    Le Web, c'est très différent du winform...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/05/2011, 23h31
  2. Réponses: 2
    Dernier message: 05/02/2010, 17h05
  3. Réponses: 1
    Dernier message: 26/11/2008, 10h33
  4. Réponses: 2
    Dernier message: 29/08/2008, 14h17
  5. Réponses: 1
    Dernier message: 28/02/2007, 19h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo