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][AJAX] Problème UpdatePanel /Click


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Points : 84
    Points
    84
    Par défaut [ASP.NET][AJAX] Problème UpdatePanel /Click
    Bonjour à tous,

    Je travaille sur un webform devant gérer l'ajax.
    Ce composant contient un UpdatePanel lui même contenant un ensemble de composants graphiques. La répartition est la suivante : chaque ligne du webcontrol contient un bouton et un literalcontrol

    Cette liste de composants est créé à partir d'une méthode.

    Dans la méthode Init(), j'ajoute l'UpdatePanel dans le webcontrol et je fais appelle à la méthode servant à créér la liste des composants graphiques.

    dans la méthode CreateChildControls, je fais un foreach sur ma liste et je créé les composants graphiques que j'ajoute dans l'UpdatePanel. Lorsque je créé le bouton j'ajoute un évènement Click. Dans cette méthode, je rajoute un composant graphique dans l'UpdatePanel.


    Le problème est que lorsque je déploie le webcontrol sur une page, la bouton ne fait pas ce que je lui demande.

    Je précise que j'ai bien installé les extensions asp.NET/Ajax sur mon serveur IIS 6 et que ma master page a bien un scriptmanager d'instancié.

    Merci de votre aide

    Loic

  2. #2
    Membre actif Avatar de gwadakillah
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 235
    Points : 239
    Points
    239
    Par défaut
    peux tu montrer ton code?

  3. #3
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    à tu définit le control ID de ton trigger ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="idControl" EventName="Click" />
        </Triggers>

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Points : 84
    Points
    84
    Par défaut
    Pour commencer voici mon code :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
            protected override void OnInit(EventArgs e)
            {
                base.OnInit(e);
                this.Controls.Add(_up);
                CreateList();
            }
     
            private void CreateList()
            {
                _list.Add("element 1");
                _list.Add("element 2");
                _list.Add("element 3");
                _list.Add("element 4");
                _list.Add("element 5");
     
            }
     
            protected override void CreateChildControls()
            {
                base.CreateChildControls();
     
                foreach (string nom in List)
                {
                    Button bt = new Button();
                    bt.Text = "+";
                    bt.Click += new EventHandler(bt_Click);
                    _up.ContentTemplateContainer.Controls.Add(bt);
                    AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
                    trigger.ControlID = bt.UniqueID;
                    trigger.EventName = "Click";
                    _up.Triggers.Add(trigger);
     
                    LiteralControl elt = new LiteralControl();
                    elt.Text = nom + "<br/>";
                    _up.ContentTemplateContainer.Controls.Add(elt);
     
                }
            }
     
            void bt_Click(object sender, EventArgs e)
            {
                _up.ContentTemplateContainer.Controls.Add(new LiteralControl("ajout !!</br>"));
            }
    Pour information mon fichier web.config est bien paramétré (sinon je n'aurais jamais pu afficher ma page :p)

    Le webcontrol je le met dans un page layout et le script manager est dans la masterpage

  5. #5
    Membre actif Avatar de gwadakillah
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    235
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 235
    Points : 239
    Points
    239
    Par défaut
    ce que je ne comprends pas, c'est quel interet as tu de mettre tes controles dynamiquement ?

  6. #6
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trigger.ControlID = bt.UniqueID;

    Essai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    trigger.ControlID = bt.ID;
    les deux propriété ne te renvoi pas la même valeur...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Points : 84
    Points
    84
    Par défaut
    Oui c'est vrai que l'exemple n'est pas très parlant.

    Admettont maintenant l'archi suivante :
    - d'un coté un serveur web
    - de l'autre une base de données

    La page contenant le control est bien entendu sur le serveur web.
    Sur la base de donnée, une structure hiérarchique comme un menu est stocké.
    Lors du premier appel de la page, je demande au serveur BD de me récupérer la structure hiérarchique non pas entière mais partielle. Pour chaque noeuds entre le root et le noeud actuel, je récupere les fils. A partir de là, je créé une liste ordonnée qui me permettra d'afficher un menu sous la forme d'un tableau (pour information je travaille sous sharepoint et les tableaux sont mieux gérés que les CSS).
    Pour conclure sur le premier appel, j'ai une liste d'affichée qui contient un bouton et un label.

    Lorsque je clique sur le bouton + devant "element 1" (cf code) je veux récupérer les sous noeuds de element 1 contenus dans la structure hierarchique coté serveur.

    J'espère avoir été clair et si c'est pas le cas n'hésitez à me demander des précisions.

    Merci.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Points : 84
    Points
    84
    Par défaut
    En fait le probleme ne doit pas venir de l'ajax mais de l'asp.

    J'ai une question concernant les WebControl.

    Lorsque l'on execute une page la premiere fois, le WebControl va executer les méthodes OnInit(), OnLoad() et CreateChilNodes().

    Lorsque je clique sur un des boutons, la méthode va créer un label dans le webcontrol mais, rien ne se passe... ou plutot, un post back est effectué ce qui recharge le webcontrol sans rien ajouter

    Pourquoi? Serait il possible qu'au post back le controle soit rechargé en réexecutant les méthodes OnInit(), OnLoad() et CreateChilNodes()?
    Dans ce cas il est normal que je ne vois jamais apparaitre les composants ajoutés par le clic du bouton... :'(

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Points : 84
    Points
    84
    Par défaut
    Avec ce code tout simple en asp, le composant ne se voit jamais ajouté d'éléments en plus car il repasse par les cases OnLoad et OnInit. Remarquez, je suis complement nioub en ASP.NET donc peut être que je suis completement parti en vrille dès le départ et peut être que ce que je veux faire est impossible


    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Web.UI.WebControls;
    using System.Collections;
    using System.Web.UI;
     
    namespace ClassLibrary2
    {
        public class Class1 : WebControl
        {
            private ArrayList _list = new ArrayList();
     
            public ArrayList List
            {
                get { return _list; }
                set { _list = value; }
            }
     
     
            protected override void OnInit(EventArgs e)
            {
                base.OnInit(e);
            }
     
            protected override void CreateChildControls()
            {
                base.CreateChildControls();
     
                foreach (string nom in List)
                {
                    Button bt = new Button();
                    bt.Text = "+";
                    bt.Click += new EventHandler(bt_Click);
                    this.Controls.Add(bt);
     
                    LiteralControl elt = new LiteralControl();
                    elt.Text = nom + "<br/>";
                    this.Controls.Add(elt);
     
                }
            }
     
            void bt_Click(object sender, EventArgs e)
            {
                _list.Add("element 1");
            }
        }
    }

  10. #10
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Pense à ajouter les attrubits ScriptService pour les méthodes et classe que tu accès à partir d'AJAX.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [System.Web.Script.Services.ScriptService]

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2005
    Messages : 135
    Points : 84
    Points
    84
    Par défaut
    Petit up pour mon sujet.

    EN fait j'ai comme l'impression que vous n'avez pa compris mon probleme donc je vais essayer de le reformuler.


    Dans ma page asp .NET j'ai un WebControl.

    Dans la version sans ajax j'ai créé une liste de LiteralControl qui est dépendante du noeud de navigation courant (PortalSiteMapNode : navigation sous MOSS 2007).

    Dans la version ajax, je voudrais ajouter devant ces LiteralControl un bouton permettant d'afficher les fils du noeud cliqué ou les cacher.

    En gros je pense que vous avez compris que je veux recréer le comportement du Treeview. Or, mes ordres sont clairs et c'est là que se pose le problème... On ne veut pas rapatrier entierement la navigation d'un coup mais juste ce que l'on a besoin.

    Dans l'UpdatePanel j'essaie donc de générer la liste des literalcontrols.
    ça marche au premier appel mais lorsque je clique sur l'un des bouton, le webcontrol relance les méthodes oninit(), onload(), createchildnodes()... et donc mon control affiche la meme chose qu'avant...

    ça me les brises depuis plus d'une semaine donc si quelqu'un peut me venir en aiiidddeee

    merci

  12. #12
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Dans ton méthode Page_Load tu doit initialiser ton treeView uniquement si la propriété IsPostBack est positionné à false


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(!Page.IsPostBack)
    {
    //initialisation du TreeView
    }
    else
    {
    ...
    }

Discussions similaires

  1. Réponses: 8
    Dernier message: 28/05/2009, 10h40
  2. Réponses: 0
    Dernier message: 06/02/2009, 20h20
  3. [ASP.NET AJAX] FilteredTextBox problème
    Par ronando dans le forum ASP.NET
    Réponses: 1
    Dernier message: 27/11/2007, 15h08
  4. ASP AJAX (problème UpdatePanel)
    Par Christophe@prog dans le forum ASP.NET
    Réponses: 2
    Dernier message: 16/07/2007, 15h25
  5. Réponses: 4
    Dernier message: 27/06/2007, 09h13

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