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...