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 :

Gérer plusieurs usercontrol dans une même page


Sujet :

ASP.NET

  1. #1
    Membre expérimenté Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Points : 1 338
    Points
    1 338
    Par défaut Gérer plusieurs usercontrol dans une même page
    Bonjour a tous

    Dans le cadre d'un projet perso, j'ai une page permettant d'initialiser une appli web.

    cette page fait appel à plusieurs UserControls.

    Le premier est wucResume qui permet d'afficher l'ensemble des étapes, celles qui sont correctes, celles qui sont encore à faire,...

    Ce userControl a des boutons pour executer les étapes de configs

    WUCResume.ascx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     <asp:Button ID="btnRunStep1" runat="server" Text="Run" 
            onclick="btnRunStep1_Click" meta:resourcekey="btnRunStep1Resource1" />
    ...
        <asp:Button ID="btnRunStep2" runat="server" Text="Run" 
            onclick="btnRunStep2_Click" meta:resourcekey="btnRunStep2Resource1" />
    boutons qui appellent des évènements de ma page principale

    WUCResume.ascx.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            public event EventHandler btnRunStep1Click;
            public event EventHandler btnRunStep2Click;
     
    protected void btnRunStep1_Click(object sender, EventArgs e)
            {
                btnRunStep1Click(sender, e);
            }
     
            protected void btnRunStep2_Click(object sender, EventArgs e)
            {
                btnRunStep2Click(sender, e);
            }
    default.aspx.cs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    protected void Step1_Click(object sender, EventArgs e)
            {
                .............
            }
    Le fonctionnement est le suivant :

    lors du chargement de la page, je charge mon WUCResume, je définis les évènements, l'affiche et précise en session que je suis sur le WUC resume

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    if (!IsPostBack)
                {
     
                    wucResume = (WUCResume)LoadControl("./wucresume.ascx");
                    wucResume.btnRunStep1Click += Step1_Click;
                    wucResume.btnRunStep2Click += Step2_Click;
     
                    phContent.Controls.Clear();
                    phContent.Controls.Add(wucResume);
     
                    Session["action"] = "resume";
                }
    Lors du clic sur Step1, ou Step2, je sais grace a la session que je viens du wucResume et donc le recharge :

    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
    20
    21
    22
    23
    24
     
     protected void Page_Load(object sender, EventArgs e)
            {
                if (Session["action"] != null)
                {
                    if (Session["action"].ToString().CompareTo("resume") == 0)
                    {
                        wucResume = (WUCResume)LoadControl("./wucresume.ascx");
                        wucResume.btnRunStep1Click += Step1_Click;
                        wucResume.btnRunStep2Click += Step2_Click;
     
                        phContent.Controls.Clear();
                        phContent.Controls.Add(wucResume);
                    }
                    else if (Session["action"].ToString().CompareTo("step1") == 0)
                    {
                        phContent.Controls.Clear();
                        wucStep1 = (WUCStep1)LoadControl("./wucstep1.ascx");
                        //add the usercontrol STEP1 in the place holder
                        phContent.Controls.Add(wucStep1);
                    }
     
                    if(!IsPostback)........
                }
    le code exécute lors la fonction de mon évènement se trouvant dans ma page qui va charger le wuc de l'étape voulue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    protected void Step1_Click(object sender, EventArgs e)
            {
                phContent.Controls.Clear();
                wucStep1 = (WUCStep1)LoadControl("./wucstep1.ascx");
                //add the usercontrol STEP1 in the place holder
                phContent.Controls.Add(wucStep1);
     
            }
    Le UserControl Step1 s'affiche parfaitement.

    de plus dans le pageLoad de mon wucstep1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    protected void Page_Load(object sender, EventArgs e)
            {
                Session["action"] = "step1";
            }
    L'ensemble de ces étapes fonctionnent parfaitement puisque je sais quel WUC est affiché par ma session et je le recharge donc lors du pageLoad.


    Mais dans mon WUCStep1 il y a un bouton qui a son évènement dans le WUC et non dans la page default.

    . Or lors du premier clic sur ce bouton rien ne se passe, la fonction appelée par le bouton n'est jamais appelée , il faut que je clique une deuxième fois sur ce bouton pour que la fonction soit appelée.

    J'ai fait du pas à pas et c'est exactement le même code qui est exécuté à chaque fois, sauf que la seconde fois, la fonction est bien appelée....

    Est ce que qqun aurait la cause de cette particularité et comment y remédier.

    Merci

  2. #2
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    Ceci resemble a un probleme de cycle de vie de ta page. Crees tu tes controles avant le page load? si ce n'est pas le cas, c'est ce qu il faut faire...

  3. #3
    Membre expérimenté Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Points : 1 338
    Points
    1 338
    Par défaut
    Salut Arthis

    merci de tes précisions.

    Jusqu'à présent, mes controles étaient loadés dans mon page_Load.

    Suivant tes conseils je les ai initialisés dans le page Init, mais par cette solution je ne rentre plus dans mon évènement btnRunStep1_Click
    et donc le deuxieme UserControl ne s'affiche plus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    protected void Page_Init(object sender, EventArgs e)
            {
                        wucResume = (WUCResume)LoadControl(ParameterKeys.APPLICATION_WUC_RESUME);
                        wucResume.btnRunStep1Click += btnRunStep1_Click;
                        wucResume.btnRunStep2Click += btnRunStep2_Click;
     
     
                        wucStep1 = (WUCStep1)LoadControl(ParameterKeys.APPLICATION_WUC_STEP1);
     
     
            }
    Une idée de pourquoi??

    Merci

  4. #4
    Membre expérimenté Avatar de Arthis
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 265
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Italie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 265
    Points : 1 352
    Points
    1 352
    Par défaut
    Il y a un tuto sur developpez qui traite du cycle de vie de la page.

    Ce qu il faut se rappeler concernant la création dynamique de controle c'est qu'ils doivent déja être instancié avant le page load afin de recuperer les evenements les affectants lors d'un postback (cela est determiné lors de la récuperation du postback). Le controle va alors comparer son état à celui qui lui est renvoyé par le viewstate.

    Une chose importante est qu il puisse se retrouver dans le viewstate envoyé. Pour cela la création des controles doit se faire le meme ordre, afin de conserver des ID similaires d'un postback sur l'autre.

  5. #5
    Membre expérimenté Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Points : 1 338
    Points
    1 338
    Par défaut
    J'ai relu le tutoriel dont tu parles mais ça ne m'a pas plus aidé.

    J'ai décidé donc de changer de méthode et j'ai passé tous mes UserControl en statique et je joue sur l'attribut Visible.

    Merci de t'être intéressé au probleme.

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/07/2008, 16h16
  2. [XHTML] comment déclarer plusieurs doctypes dans une même page
    Par elsapascal dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 21/06/2008, 11h20
  3. Réponses: 11
    Dernier message: 07/08/2007, 17h11
  4. Gérer plusieurs connexions dans une seule page Aspx
    Par Inspirate dans le forum Accès aux données
    Réponses: 6
    Dernier message: 12/07/2007, 15h06

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