none
[ASP.NET 2.0] Binding UserControl [VS2005] RRS feed

  • Question

  • Bonjour,

    Je suis sur un projet VS 2005 où je dois binder un UserControl (une pop in* nom donné pour une dialog).

    Dans une GridView, je dois a partir d'un lien ouvrir ce UserControl sous la forme d'une dialog en bindant les données selon la ligne sélectionnée.

    J'utilise une command pour la sélection dans mon GridView.

    Dans l'event de ma command, je fais appel a ma méthode de chargement pour l'affichage de mon dialog, mais lors de mes tests rien est affiché.

    Voici le code de l'event du clic pour l'ouverture de la dialog

     

     

    switch (e.CommandName)
    
                {
    
    		case "DetailMouvement":
    
                        // Passage par popin
    
                        string mvt = (string)e.CommandArgument;
    
    		    //récupération de l'élément a binder
    
                        MouvementEntityView mvtDetail = ConsultationContratController.Instance.Context.ContratCourant.MouvementsList[mvt];
    
       		    UcDetailMouvement.Results_DataBound(mvtDetail);
    
    int des = mvtDetail.SupportDesinvestis.Count;
    
                        int inv = mvtDetail.SupportInvestis.Count;
    
                        const int baseHeight = 260;
    
                        const int header = 15;
    
                        int height = baseHeight + (des * 15) + (inv * 15) + (des > 0 ? header : 0) + (inv > 0 ? header : 0);
    
                        ScriptManager.RegisterStartupScript(this, GetType(), "ShowDetail", "ShowPopin('700','" + height + "','0','','divMvtDetails');", true);
    
                        break;
    
    }

    La méthode de binding de mon UserControl

     

    public void Results_DataBound(MouvementEntityView data)
            {
                LblDateMouvement.Text = data.DateMouvement;
                LblMontantNet.Text = data.MontantNetDecimal.ToString("c");
                LblNatureMouvement.Text = data.Nature;
                LblNumContrat.Text = data.NumMouvement;
                LblStatut.Text = data.Statut;
    
    		//Mon UC contient un autre UC
                if (data.SupportDesinvestis != null && data.SupportDesinvestis.Count > 0)
    
                {
    
                    panelDesinvestissement.Visible = true;
    
                    UcDesinvestissement.Results_DataBound(data.SupportDesinvestis, null);
                }
                else
                    panelDesinvestissement.Visible = false;
    
                if (data.SupportInvestis != null && data.SupportInvestis.Count > 0)
                {
                    panelInvestissement.Visible = true;
                    UcInvestissement.Results_DataBound(data.SupportInvestis, null);
                }
                else
                    panelInvestissement.Visible = false;
            }

     

    Ce que je remarque en debug, c'est que comme le binding se passe après la Page_Load, et bien ça ne passe pas, mais je ne sais pas comment résoudre le problème.

     

    Merci d'avance.

     

     

     

     

     

     



    • Modifié OminiuS mercredi 3 août 2011 07:58
    mardi 2 août 2011 15:25

Réponses

  • Merci pour votre aide!

     

    Comme je fais une maintenance évolutive de la pire application de ma société (une vrai usines à gaz bourré de code mort...), c'est un peu compliqué de se mettre dedans!

    Il s'agissait d'un UpdatePanel qui encapsulait ma gridView qui devait empêcher le "binding" des données de la "popin"!

     

    Merci de vous être pencher sur le problème néanmoins!

    jeudi 4 août 2011 15:31

Toutes les réponses

  • Bonjour,

    "rien n'est affiché" c'est à-dire la popup apparait mais sans données "bindées" ou elle n'apparait pas du tout ?

    Si 1) le binding ne se fait pas dans UcDetailMouvement.Results_DataBound(mvtDetail); ? Si oui il serait sans doute intéressant de montrer ce que l'on a dedans ?

    Si 2) pas d'erreur javascript ? le code js est bien présent dans la page ?

    Faire peut-être une petite maquette  ce qui permettra :
    1) de pouvoir tester/trouver plus facilement la bonne approche
    2) au pire de pouvoir montrer un exemple le plus court possible mais complet pour que qq puisse y jeter un oeil

    Pour l'instant, je n'ai pas le sentiment d'avoir tous les éléments pour comprendre l'intégralité de la solution que vous essayez de mettre en place voire le problème exact rencontré (popup mais le binding ne se fait pas ou même pas de popup du tout pour l'instant ?).

    Le titre étant un problème sur le Binding, j'ai fait un essai avec comme UserControl :

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
    <asp:FormView runat="server" id="frm">
    <ItemTemplate>
    <asp:TextBox runat="server" Text='<%#Eval("Nom")%>' />
    </ItemTemplate>
    </asp:FormView>

    Avec une propriété DataSource :

      public object DataSource
      {
        get
        {
          return frm.DataSource;
        }
        set
        {
          frm.DataSource = value;
        }
      }
    


    Sur la sélection dans la grille je fais qq chose comme :

      public void grd_SelectedIndexChanged(object sender,EventArgs e)
      {
        GridView grd = (GridView)sender;
        usr.DataSource = Data.GetSample().Where(o=>o.pk==(int)grd.SelectedValue);
        usr.DataBind();
      }
    



     

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 2 août 2011 16:20
    Modérateur
  • Donc la popup apparait mais sans données "bindées" et je n'ai pas de pb js.

     

    J'avais cru avoir mis ma méthode Results_DataBound, sans doute l'ai-je effacé par mégarde, je l'ai ajouté dans le message d'origine.

    Je dois bindé des champs Text de Label et deux autres UC contenant une Datagrid.

     

    Mon objet a bindé MouvementEntityView contient des properties de string et d'autres objets.

     

    Merci.

    mercredi 3 août 2011 08:02
  • Ok donc le "binding" est fait "à la main". Que donne un point d'arrêt pour vérifier que les valeurs du contrôle sont bien alimentées et surtout qu'elles ne sont pas modifiées après coup (par exemple vérifier dans le PreRender du contrôle Utilisateur).

    Egalement quel est l'évènement qui contient ce code (RowCommand du gridview ? Moi je l'avais mis dans le SelectedIndexChanged comme apparemment de toute fçon le but de la commande est de sélectionner une ligne). J'essaierai plus tard de modifier ma maquette pour me rapprocher de votre principe et voir si je trouve qq chose qui pourrait coincer mais à première vue cela doit encore être un autre élément que ce que l'on a là qui coince (aucun de ces contrôles n'est ajouté dynamiquement, ils sont tous dans le markup ASPX ?)

    Effectivement cela ne change pas grand chose... Dans mon UserControl j'ai crée une méthode SetData qui est l'équivalent. Cela donne quoi si vous le faites à partir d'un <asp:CommandField ShowSelectButton="true" /> ?

    On en revient au point précédent :
    - faire une maquette simple comme la mienne pour voir
    - et donc soit vous finissez par trouver soit essayer de mettre le code réduit au minimum SVP pour que l'on puisse voir ce que vous faites (par exemple si on arrive déjà pas avec un UserControl, le UserControl imbriqué n'a sans doute aucune importance pour l'instant).

     

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mercredi 3 août 2011 11:46
    Modérateur
  • Lorsque je suis dans le OnPreRender(), j'ai bien les bonnes valeurs dans les lbl.Text mais pas a l'affichage :x

    J'utilise l'event RowCommand qui est implémenté dans l'aspx.cs qui contient le UserControl.

     

    J'ai essayé en utilisant le commandField avec un DataKeyNames pour récupérer avec le selectedValue l'information dont j'ai besoin pour récupérer l'affichage pour ensuite faire mon binding a la main et j'obtiens le même comportement, bons labels au OnPreRender et rien dans l'affichage!

    mercredi 3 août 2011 15:24
  • Y a quoi après le PreRender ?! ;-)

    Peut-être faire un "afficher la source" dans le navigateur pour voir les valeurs générées directement dans la page HTML ? Il n'y aurait pas un morceau de js, un appel AJAX, un style css ou qq chose comme cela qui effacerait ou masquerait les infos qui auraient été en fait générées correctement ?

    Tout est bien dans la page HTML et le "popin" est juste un div que l'on rend visible ? Ou on ne montre pas le bon DIV ?

    Désolé mais je commence un peu à être à court d'idée. L'appli utilise d'autres pages basées plus ou moins sur le même principe j'imagine ? Si oui, qu'aurait elle de différent par rapport à ces autres pages ?

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mercredi 3 août 2011 15:52
    Modérateur
  • Le JS est bon et c'est la bonne div qui est affichée...

     

    Je suis a court d"idées aussi...

    jeudi 4 août 2011 09:13
  • Ou le contrôle est également lié d'une autre façon à des données et le DataBind efface les données définies "manuellement" ? Par exemple comment le conteneur de ce user control récupère t'il ses données ? Cela donne si on mets un point d'arrêt dans la méthode DataBind de ce UserControl ?

    On en revient à faire peut-être une maquette qui, si elle fonctionne, permettrait de valider que le principe est correct et qu'il y a bien qq chose dans cette page en particulier qui est mal défini et provoque ce phénomène.

    Bon courage.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    jeudi 4 août 2011 10:07
    Modérateur
  • Bonjour,

     

    Je pense que l'utilisation du mot "Binding" est trompeur dans ton cas même si ça fait sans car il utiliser en général pour désigner la pattern DataBinding qui doit être implémenter avec les contrôl DataBindig comme ObjectDataSource que je pense conviendrait mieux dans ton cas, tu peux te référer au lien suivant pour une explication complète : http://msdn.microsoft.com/fr-fr/library/system.web.ui.webcontrols.objectdatasource(v=VS.80).aspx

    Sinon e n'arrive pas à détecter à quel moment tu utilise ces contôles.

     

    Bon courage.

    jeudi 4 août 2011 12:04
    Auteur de réponse
  • Merci pour votre aide!

     

    Comme je fais une maintenance évolutive de la pire application de ma société (une vrai usines à gaz bourré de code mort...), c'est un peu compliqué de se mettre dedans!

    Il s'agissait d'un UpdatePanel qui encapsulait ma gridView qui devait empêcher le "binding" des données de la "popin"!

     

    Merci de vous être pencher sur le problème néanmoins!

    jeudi 4 août 2011 15:31