Bonjour,
Je cherche à exporter un grid view dans une document excel.
J'ai suivi le tuto sur le site mais je me retrouve avec une erreur dont je ne comprend pas l'origine.
Il place l'erreur sur:Control 'gvwExistingRight' of type 'GridView' must be placed inside a form tag with runat=server.
Or voici ma page aspx:
Code : Sélectionner tout - Visualiser dans une fenêtre à part gvwExistingRight.RenderControl(oHtmlTextWriter);
Mon gridview est alimenté par une fonction dans le codebehind.
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
37
38
39
40
41
42
43
44
45 <form id="form1" runat="server"> <asp:GridView ID="gvwExistingRight" runat="server" AutoGenerateColumns="False" AllowPaging="False" DataKeyNames="VAL" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="0px" ShowFooter="True" CellPadding="4" ForeColor="Black" GridLines="Horizontal" OnRowEditing="gvwExistingRight_RowEditing" OnRowCancelingEdit="gvwExistingRight_RowCancelingEdit" OnRowDeleting="gvwExistingRight_Delete" OnRowUpdating="gvwExistingRight_RowUpdating" OnRowDataBound="gvwExistingRight_RowDataBound" Width="100%"> <RowStyle Font-Names="Arial" Font-Size="XX-Small" /> <Columns> <asp:TemplateField HeaderText="Domain" SortExpression="Domain"> <ItemTemplate> <asp:Label ID="lblDomain" runat="server" Text='<%#Eval("DOM") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> [...] // Je vous fais grace des 13 colonnes <asp:TemplateField HeaderText="Edit" ShowHeader="False"> <EditItemTemplate> <asp:LinkButton ID="lbn1" runat="server" CausesValidation="True" CommandName="Update" Text="Update"></asp:LinkButton> <asp:LinkButton ID="lbn2" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"></asp:LinkButton> </EditItemTemplate> <ItemTemplate> <asp:LinkButton ID="lbn1" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"></asp:LinkButton> </ItemTemplate> </asp:TemplateField> <asp:CommandField HeaderText="Delete" ShowDeleteButton="True" ShowHeader="True" /> </Columns> <PagerStyle BackColor="White" ForeColor="Black" HorizontalAlign="left" /> <SelectedRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" /> <EditRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#CCCCCC" Font-Bold="True" HorizontalAlign="left" Font-Names="Arial" Font-Size="X-Small" ForeColor="White" /> <RowStyle Font-Names="Arial" Font-Size="XX-Small" HorizontalAlign="left" /> <AlternatingRowStyle BackColor="#F2F2F2" /> </asp:GridView> <br /> <asp:ImageButton ID="ibnGridViewToExcel" runat="server" Height="24px" ImageUrl="~/images/BUTTON/icone-excel.jpg" OnCommand="ibnGridViewToExcel_Click" Text="Export to Excel" Width="24px" /> </form>
Voici le code pour l'export:
J'ai remis les commentaires du tuto pour aller plus vite à la lecture !!
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 protected void ibnGridViewToExcel_Click(object sender, System.EventArgs e) { //export to excel //On appelle de verifColonne avec le nom du DataGrid concerné en paramètre ClearControls(gvwExistingRight); //On efface les éventuelles données déjà dans la mémoire tampon Response.Clear(); //On place tout ce qui est destiné au client dans la mémoire tampon Response.Buffer= true; //On définit le type d'informations renvoyée, ici des données au format Excel Response.ContentType = "application/vnd.ms-excel"; //On efface le jeux de caractères actuellement défini Response.Charset = ""; //On instancie deux objets qui vont nous permettre de récupérer les données du DataGrid : //le StringWriter et l'HtmlTextWriter EnableViewState = false; StringWriter oStringWriter = new StringWriter(); HtmlTextWriter oHtmlTextWriter = new HtmlTextWriter(oStringWriter); // On extrait le contenu du DataGrid dans l'HtmlTextWriter gvwExistingRight.RenderControl(oHtmlTextWriter); //On copie le contenu extrait dans la mémoire tampon Response.Write(oStringWriter.ToString()); //On ferme "le flux" de données et envoie les données au client Response.End(); } private void ClearControls(Control control) { //On récupère le nombre de controles enfants composant le DataGrid for (int i=control.Controls.Count -1; i>=0; i--) { ClearControls(control.Controls[i]); } //Si la cellule ne contient pas du texte simple if (!(control is TableCell)) { //Si le controle concerné à une prorpiété "Selected Item" alors... //Remarque : Seul les controles offrant des choix multiples ont une propriété "SelectedItem" if (control.GetType().GetProperty("SelectedItem") != null) { LiteralControl literal = new LiteralControl(); control.Parent.Controls.Add(literal); try { //La cellule prend alors pour valeur le texte correspondant à la propriété "SelectedItem" literal.Text = (string)control.GetType().GetProperty("SelectedItem").GetValue(control, null); } catch { //On récupère l'exception en cas de problème } //Le controle concerné est retiré control.Parent.Controls.Remove(control); } else //Si le controle concerné n'a pas de propriété "SelectedItem" alors on récupère le //texte (s'il y en a un) de sa propriété "Text" if (control.GetType().GetProperty("Text") != null) { LiteralControl literal = new LiteralControl(); control.Parent.Controls.Add(literal); //On attribue le texte de la propriété "Text" à la cellule concernée literal.Text = (string)control.GetType().GetProperty("Text").GetValue(control,null); control.Parent.Controls.Remove(control); } } return; }
Voilà, si vous avez une idée ... à votre bon coeur messieurs dames !!
Merci à vous !!
Partager