Bonjour,
Je suis en train de réaliser une page en ASP.NET / C#.
Sur cette page j'ai deux Textbox, deux DropDownList et un Button.
Au chargement de ma page il n'y a que les Textbox et les DropDownList qui se chargent.
Lors du clique sur le Button le datasource (une Liste d'object) de mon Gridview est rempli en code-behind et il est affiché.
Mes objets contiennent une propriété IsValid, qui est un Boolean, en fonction de ce Boolean je dois afficher soit une Image (une petite image indiquant que c'est valide) si c'est true, et si c'est false je dois afficher un ImageButton qui au déclenchement doit intervenir en bdd pour changer la propriété à true.
J'ai fais un premier essai en statique où j'ai toujours mis le ImageButton et avec les commands je lance ma requête et ca change la propriété de mon objet. Ca a bien fonctionné. Cet ImageButton je le déclarais dans mon code ASP.
Maintenant je dois faire que cela soit dynamique. Donc pour cela j'ai fais comme suis:
Ma déclaration du Gridview (Je ne met que la partie intéressante).
La fonction liée à l'événement RowDataBound:
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 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" AlternatingRowStyle-BackColor="Beige" EmptyDataText="Aucun résultat trouvé" OnRowDataBound="CustomersGridView_RowDataBound" OnRowCreated="GridView1_RowCreated"> <Columns> <%-- <asp:CommandField ShowEditButton="true" EditImageUrl="~/images/webdev-config-32x32.png" ButtonType="Image" HeaderText="Edit" />--%> <asp:TemplateField HeaderText="Edit"> <ItemTemplate> <asp:ImageButton ID="btnValidate" ImageUrl="~/images/webdev-config-32x32.png" AlternateText="Edit" runat="server" PostBackUrl='<%# "./edit.aspx?id=" + Eval("Id") %>' /> <asp:HiddenField ID="idprodmon" runat="server" Value='<%# Eval("Id")%>' /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Valider"> <ItemTemplate> </ItemTemplate> </asp:TemplateField> ... <asp:TemplateField HeaderText="Suppr"> <ItemTemplate> <asp:ImageButton ID="btnSuppr" ImageUrl="~/images/webdev-cancel-32x32.png" AlternateText="Suppr" runat="server" CommandName="suppr" CommandArgument='<%# Eval("Id")%>' OnCommand="CommandBtn_Click" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
J'ai testé avec le RowDataBound et RowCreated, ca fonctionne dans les deux cas, j'ai décidé de mettre le code dans le RowDataBound, je ne sais pas ce qui est le plus conseillé.
La fonction qui gère les command:
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
35
36 protected void CustomersGridView_RowDataBound(Object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { ShowValidateBtnOrImg(e); } } private void ShowValidateBtnOrImg(GridViewRowEventArgs e) { ProductionMonitoring prodmon = e.Row.DataItem as ProductionMonitoring; if (prodmon != null) { if (prodmon.IsValid) { Image imgBtn; imgBtn = new Image(); imgBtn.ID = "btnValider"; imgBtn.ImageUrl = "~/images/webdev-ok-32x32.png"; imgBtn.AlternateText = "Valider"; e.Row.Cells[1].Controls.Add(imgBtn); } else { ImageButton imgBtn = new ImageButton(); imgBtn.ID = "btnValider"; imgBtn.ImageUrl = "~/images/webdev-remove-32x32.png"; imgBtn.AlternateText = "Valider"; imgBtn.CommandName = "validate"; imgBtn.CommandArgument = ((ProductionMonitoring)e.Row.DataItem).Id.ToString(); imgBtn.Command += new CommandEventHandler(this.CommandBtn_Click); e.Row.Cells[1].Controls.Add(imgBtn); } } }
L'ImageButton de suppression fonctionne très bien.
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 protected void CommandBtn_Click(Object sender, CommandEventArgs e) { Debugger.Break(); switch ((String)e.CommandName) { case "suppr": ProductionMonitoringManager.Instance.Delete(Convert.ToInt32((String)e.CommandArgument)); Label1.Text = (String)e.CommandArgument; break; case "validate": //ProductionMonitoringManager.Instance.Validate(Convert.ToInt32((String)e.CommandArgument)); Label1.Text = (String)e.CommandArgument; break; default: break; } }
L'ImageButton de validation ne fonctionne pas. Là où on peut apercevoir le Debugger.Break(), en cliquant sur le bouton de validation je n'y passe jamais. Aussi quand je clique sur le bouton de validation au rechargement de ma page, toute cette colonne se vide, les boutons disparaissent.
Je pense que cela est dû au fait que je les charges dynamiquement... Mais je ne comprends pas comment changer cela. J'ai fais plusieurs test en vain comme recharger le GridView relancer le Databind, peut-être que je ne l'ai pas fait au bon endroit.
Est-ce que je crée mal mon ImageButton ?
Faut-il recharger complétement mon GridView lors de chaque action sur ma page pour relancer les événements RowDataBound ou RowCreated ?
Partager