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.
Control 'gvwExistingRight' of type 'GridView' must be placed inside a form tag with runat=server.
Il place l'erreur sur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
gvwExistingRight.RenderControl(oHtmlTextWriter);
Or voici ma page aspx:
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>
Mon gridview est alimenté par une fonction dans le codebehind.
Voici le code pour l'export:
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;
        }
J'ai remis les commentaires du tuto pour aller plus vite à la lecture !!
Voilà, si vous avez une idée ... à votre bon coeur messieurs dames !!

Merci à vous !!