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 :

[C#][ASP 2.0] Interactions entre User Controls


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut [C#][ASP 2.0] Interactions entre User Controls
    Bonjour (désolé c'est encore moi...),

    Je developpe un intranet avec lequel un utilisateur peut affiner les resultat de sa recherche en navigant dans un TreeView. A gauche, le TreeView en question et a droite, un DataGrid qui contient tous les documents fils depuis le noeud du TreeView (les documents ne sont pas des noeuds, mais sont soumis a la hierarchie de l'arbre).

    Lorsque l'utilisateur selectionne un noeid je dois envoyer au DataGrid les données necessaire pour permettre d'afficher les documents recherchés depuis un Bdd. Jusque la ca va pas si mal.

    Mon probleme actuellement c'est que lorsque l'utilisateur selectionne un noeud du TreeView, le DataGrid a "un coup de retard".

    En y reardant de plus pres, lorsque je selectionne mon noeud, la page est rechargé et l'evenement de la selection est consomé... Je ne comprend pas pourquoi ma page se recharge AVANT que l'evenement de sa precedente ne soit consomé...
    Ca fait : *Selection du noeud* ... Page_Load->Evenement_Selection

    Je ne comprend pas.

    Voila le code de l'evenement (OnSelectedNodeChange, propre au TreeView)
    C'est dans la classe de l'arbre.
    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
            // Evenement lors de la selection
            private void                ST_SelectedIndexChange(object      sender,
                                                               EventArgs   e)
            {
                ItvTreeKey                  cur = null;
                ItvTreeKeyCollection        tkeys = (ItvTreeKeyCollection)Session["keys"];
                Docmat.UserControls.Content sync = new Docmat.UserControls.Content();
     
                cur = tkeys.Get(Int32.Parse(STree.SelectedNode.Value));
                Session["hb"] = cur.Hb;
                Session["lb"] = cur.Lb;
                Session["lvl"] = cur.Lvl;
                Session["name"] = cur.Name;
            }
     
    		private void                InitializeComponent()
    		{
                this.STree.SelectedNodeChanged += new System.EventHandler(ST_SelectedIndexChange);
    }
    Le Page_Load du dataGrid est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            public void             Page_Load(object        sender,
                                              EventArgs     e)
            {
                this.getDocs();
                DG_Content.DataSource = (DataSet)(Session["dataHolder"]);
                DG_Content.DataBind();
            }
    Je suppose que ce genre de probleme est recurent, mais je n'ai rien trouvé en cherchant sur le forum...

    J'ai bien pensé a recharger la page, mais qd ? vu qu'il s'agit de deux UserControls differents je n'ai pas accès au control lors de la selection du noeud.

    Merci d'avance de votre aide, j'ai vraiment besoin d'une explication.

  2. #2
    Membre averti
    Homme Profil pro
    Consultant SharePoint
    Inscrit en
    Mars 2006
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant SharePoint
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2006
    Messages : 270
    Points : 308
    Points
    308
    Par défaut
    ton tree est dans un update panel?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Non, voila les codes pour l'affichage :

    Pour le Tree dans Search_Tree.ascx
    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
    <%@ Control     Language="C#" 
                    Debug="true"
                    AutoEventWireup="true"
                    CodeFile="~/UserControls/Search_tree.ascx.cs"
                    Inherits="Docmat.UserControls.Search_tree" %>
     
    <%@ Register    TagPrefix="dh1" TagName="DataHolder" Src="~/UserControls/Content.ascx" %>
     
    <asp:TreeView   ID="STree" runat="server" 
                    imageSet="XPFileExplorer" nodeindent="15"
                    enableviewstate="true">
        <parentnodestyle font-bold="False" />
        <selectednodestyle backcolor="#B5B5B5" font-underline="False" horizontalpadding="0px"
            verticalpadding="0px" />
        <nodestyle font-names="Tahoma" font-size="8pt" forecolor="Black" horizontalpadding="2px"
            nodespacing="0px" verticalpadding="2px" />
        <databindings>
            <asp:treeNodeBinding textfield="Name"/>
        </databindings>
    </asp:TreeView>
    Pour la page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        <body>
            <form id="main_form" runat="server">
                    <div id="main_tree_div">
                        <st1:Tree id="MainTree" runat="server"></st1:Tree>
                    </div>
            </form>
        </body>
    J'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <%@ Register    TagPrefix="st1" TagName="Tree"
                    Src="~/UserControls/Search_tree.ascx" %>
    pour inclure le control.

    Je me renseigne sur les Update Panel mais je n'ai jamais utilisé ca (je n'ai pas beaucoup d'experience, desolé).

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    L'évènement Page_Load a lieu avant les évènements sur les controles, c'est normal. Je pense que tu t'y prends mal, ton contrôle avec une datagrid devrait posséder une méthode Update que tu appelles qd il doit se mettre à jour, et ne devrait pas se mettre à jour systématiquement dans le Page_Load.
    Une fois que l'utilisateur a choisi un noeud du treeviex, tu fais ce qu'il faut et tu appelles la méthode Update de ton user control DataGrid.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci de ton aide Sphax.

    J'ai rajouté une methode Update qui remplie le DataSet avec les données de la base selon le noeud selectionné. J'initialise seulement le dataSet dans le cas ou la page n'est pas un PostBack. Le DataSet n'est mit a jour que lorsque le noeud selectionné dans l'arbre change ou que l'on visualise la page pour la premiere fois.

    Cependant, un etrange phenomene se produit, le DataSet refuse categoriquement de se remettre a jour, j'ai testé ma requete sur un analyseur de requetes SQL, elle fonctionne bien. Dans la classe de l'arbre les informations sur le noeud selectionné sont les bonnes.

    Je crois que ca vient du DataSet mais je ne trouve pas la solution, je sais qu'on s'ecarte un peu du sujet et que je parcours encore le forum a la recherche de la solution mais si qqn avait la solution ca serait sympa.

    Merci .

    P.S : je vide le DataSet a chaque fois que je vais chercher d'autre données dans la base.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Je suis toujours planté sur ce probleme. Bon par contre je m'etais trompé, ca n'est pas le DataSet qui n'est pas mosifié (en fait ca n'est plus :p), mais c'est bien l'affichage.

    Visiblement, seul la sauvegarde du DataSet dans le ViewState est rattaché a la grille entre deux post-back.

    Voila le code de mon Page_Load :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            public void             Page_Load(object        sender,
                                              EventArgs     e)
            {
                if (!Page.IsPostBack)
                {
                    Session["dataHolder"] = new DataSet();
                    Load_data((DataSet)Session["dataHolder"]);
                    DG_Content.DataSource = (DataSet)Session["dataHolder"];
                    DG_Content.DataBind();
                }
            }
    J'ai verifié que le contenu du DataSet changeait selon mes besoins, mais il semble que seul le DataSet du premier affichage soit bindé a DG_Content (une dataGrid).

    Merci d'avance de votre aide, je ne comprend pas bien le probleme dans le cas present...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Bon j'ai reussit a reveiller mes derniers neurones et je suis revenu a la case depart mais avec une nouvelle implemetation...

    Toujours le meme probleme : il y a un temps de retard entre l'affichage de mes données et leur modification.

    Resumons :
    - Deux controles : Un TreeView et un GridView.
    - L'evenement SelectedNodeChange Modifie des variables de session contenant le DataSet bindé au DataGrid de l'autre control.
    - Le control du GridView ne fait qu'afficher son DataSet.

    Selement, encore une fois, l'affichage du control est effectué avant l'execution du code de l'evenement. Il a donc un cran de retard...

    On m'a conseillé de revoir mon implementation en implementant la methode d'affichage des controls dans le Code-Behind du .aspx qui pourrait ainsi etre herité dans les classes des controles pour synchroniser leurs affichages.

    J'attend avec impatience vos conseils et impressions... je suis dans le noir.

  8. #8
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Appelle tonGridView.DataBind() à la fin de ta fonction SelectedNodeChange()

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    EDIT

    Bon j'edit ce post confus par la fatigue, merci beaucoup, c'etait ca qu'il manquait .

    J'ai revu la structure de mon code aussi qui manquait surtout de bon sens...

    Merci a tous, le probleme est resolut !

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

Discussions similaires

  1. Communication entre User Control
    Par Imrik dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 02/12/2011, 15h54
  2. Object entre user control
    Par topolino dans le forum ASP.NET
    Réponses: 2
    Dernier message: 09/10/2008, 13h52
  3. passage de paramètres entre web user control
    Par mi1StagiR dans le forum ASP.NET
    Réponses: 5
    Dernier message: 20/05/2008, 12h17
  4. [ASP.NET][C#]Heritage sur User Control
    Par User.Anonymous dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/09/2007, 11h03
  5. Interaction entre Controle ActiveX et une autre FORM.
    Par parp1 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/03/2007, 14h10

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