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 :

Grid view user control et reflexion


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 81
    Points : 96
    Points
    96
    Par défaut Grid view user control et reflexion
    Salut

    j'ai un User control comme suit :

    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
     
    <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebControlCollaborateur.ascx.cs"
        Inherits="GestionConges.WebControlCollaborateur" %>
    <div id="Division" runat="server">
        <br />
        <br />
        <br />
        <br />
        <asp:Panel HorizontalAlign="Left" runat="server">
            <hr />
            <asp:Label ID="LabelCollaborateur" runat="server" SkinID="LabelInfoCollaborateur"
                Font-Bold="true" Font-Underline="true"></asp:Label>
            <asp:ImageButton ID="ButtonMontrer" runat="server" CausesValidation="true" Height="10px"
                OnClick="ButtonMontrer_Click" ToolTip="Cliquer pour afficher ou masquer les informations"
                Width="10px" BorderStyle="Solid" ImageAlign="Middle" ImageUrl="~/Images/plus.jpeg" />
            <hr style="height: 1px" />
            &nbsp;
        </asp:Panel>
        <asp:Panel ID="PanelInfoCollaborateur" runat="server" Visible="False">
            <asp:GridView ID="GridViewInfoCollabo" runat="server" AllowPaging="false" AllowSorting="false"
                AutoGenerateColumns="False" SkinID="GridViewStyle1" CellPadding="4" ForeColor="#333333"
                GridLines="None" HorizontalAlign="Center" PageSize="5" OnDataBound="GridViewInfoCollabo_DataBound"
                OnRowCommand="GridViewInfoCollabo_RowCommand" OnSelectedIndexChanged="GridViewInfoCollabo_SelectedIndexChanged">
                <FooterStyle BackColor="#66301F" Font-Bold="True" ForeColor="White" />
                <RowStyle BackColor="#ffffff" ForeColor="#edc382" />
                <PagerStyle BackColor="#66301F" ForeColor="White" HorizontalAlign="Center" />
                <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                <HeaderStyle BackColor="#66301F" Font-Bold="True" ForeColor="White" />
                <EditRowStyle BackColor="#999999" />
                <AlternatingRowStyle BackColor="#edc382" ForeColor="#ffffff" />
            </asp:GridView>
        </asp:Panel>
        <br />
    </div>
    dans une boucle pour chaque objet que je rencontre et qui correspond à ce que je veux (ici un utilisateur)
    je crée un User control WebControlCollab. comme suit :

    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
     
                foreach (Utilisateur ut in _utilisateurEnCours.ListeCollaborateur)
                {
                    SqlCommand chercherInfoDemande = new SqlCommand(ConfigurationSettings.AppSettings["proc_RechercherDemandeCongeUtilisateur"], connection);
                    SqlDataAdapter dataAdapter = new SqlDataAdapter(chercherInfoDemande);
                    chercherInfoDemande.CommandType = CommandType.StoredProcedure;
                    chercherInfoDemande.Parameters.Add(new SqlParameter("@personne_id", ut.IdUtilisateur));
                    DataSet ds = new DataSet();
                    dataAdapter.Fill(ds);
     
                    //on va faire le ControlUser WebControlCollaborateur
                    WebControlCollaborateur WebControlCollaborateur;
                    String virtualPath = "~/Controles/WebControlCollaborateur.ascx";
                    WebControlCollaborateur = (WebControlCollaborateur)Fonctions.LoadControl(this, virtualPath, ds, "WebControlCollaborateur" + i.ToString(), ut.NomUtilisateur, ut.PrenomUtilisateur, i.ToString(), i.ToString(), i.ToString(), i.ToString(),"demande_id");
                    WebControlCollaborateur.Visible = true;
                    this.PanelDonnees.Controls.Add(WebControlCollaborateur);
                    //this.Controls.Add(WebControlCollaborateur);
                    i++;
                }
    Je bind donc mon grid view avec les données issue du dataset.
    j'instancie mon User Control en utilisant cette fonction (Merci nico)

    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
     
            public static WebControlCollaborateur LoadControl(Page page, string pathControleUtilisateur, params object[] parametresConstructeur)
            {
                List<Type> constParamTypes = new List<Type>();
                foreach (object constParam in parametresConstructeur)
                    constParamTypes.Add(constParam.GetType());
                WebControlCollaborateur WebControlCollaborateur = (WebControlCollaborateur)page.LoadControl(pathControleUtilisateur);
                // trouve le constructeur
                ConstructorInfo constructeur = WebControlCollaborateur.GetType().BaseType.GetConstructor(constParamTypes.ToArray());
                // et l'invoke
                if (constructeur == null)
                    throw new MemberAccessException("Contrôle utilisateur non trouvé : " + WebControlCollaborateur.GetType().BaseType);
                else
                    constructeur.Invoke(WebControlCollaborateur, parametresConstructeur);
                return WebControlCollaborateur;
            }
    et enfin le constructeur de mon User Control
    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
     
            public WebControlCollaborateur(DataSet ds, string strID, string labelNom, String labelPrenom, string id_div, string id_button, string id_panel,string id_gridView,string dataSourceKey)
            {
                this.ID = strID;
                this.Controls.Add(GridViewInfoCollabo);
                this.LabelCollaborateur.Text = labelNom;
                this.LabelCollaborateur.Text += " ";
                this.LabelCollaborateur.Text += labelPrenom;
                ((HtmlGenericControl)this.FindControl("Division")).ID += id_div;
                this.FindControl("ButtonMontrer").ID += id_button;
                this.FindControl("PanelInfoCollaborateur").ID += id_panel;
                this.FindControl("PanelInfoCollaborateur").Visible = false;
                this.FindControl("GridViewInfoCollabo").ID += id_gridView;
                _DataSource = ds;
                GridViewInfoCollabo.DataSource = _DataSource;
                GridViewInfoCollabo.DataKeyNames = new string[1] { dataSourceKey };
                GridViewInfoCollabo.AutoGenerateColumns = false;
                ContruireGridView();
                GridViewInfoCollabo.DataBind();
            }
    Et la comme j'utilise plusieurs fois le même string pour le dataKeyNames du GridView il me pète une erreur :
    erreur :
    Item has already been added. Key in dictionary: 'demande_id' Key being added: 'demande_id'

    J'ai besoin d'aide svp.

    Alors que même au debbuger il me reconnais qu'une seule dataKeyNames...

  2. #2
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 81
    Points : 96
    Points
    96
    Par défaut Réponse possible
    J'ai trouvé une astuce en faisant ça lors de la création de mon gridView avant le bidn des données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                if(!Page.IsPostBack)
                  ((GridView)this.FindControl(GridViewInfoCollabo.ID)).DataKeyNames = new string[1] { dataSourceKey };
    Je teste si la page a dèjà été publié.

    Je sais pas si c'est la meilleure solution mais pour le moment je vais m'en contenter.

    Si vous avez des idées je suis preneur.

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

Discussions similaires

  1. [C#]liste de choix dans une propriété d'un user control
    Par LeDeveloppeurDotNet dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/10/2005, 12h41
  2. [C#] User control
    Par Verboz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 27/04/2005, 22h46
  3. [C#] User Control dynamic
    Par Erakis dans le forum ASP.NET
    Réponses: 10
    Dernier message: 21/10/2004, 18h54
  4. [C#] DateTimePicker web user control
    Par titi29 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 29/06/2004, 18h38
  5. [VB.NET] Provoquer le rechargement d'un user control..
    Par didoboy dans le forum ASP.NET
    Réponses: 7
    Dernier message: 30/04/2004, 14h17

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