Salut
j'ai un User control comme suit :
dans une boucle pour chaque objet que je rencontre et qui correspond à ce que je veux (ici un utilisateur)
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" /> </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>
je crée un User control WebControlCollab. comme suit :
Je bind donc mon grid view avec les données issue du dataset.
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++; }
j'instancie mon User Control en utilisant cette fonction (Merci nico)
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 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 la comme j'utilise plusieurs fois le même string pour le dataKeyNames du GridView il me pète une erreur :
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(); }
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...
Partager