Grid view user control et reflexion
Salut
j'ai un User control comme suit :
Code:
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> |
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:
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:
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:
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 :aie: :
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...