84 votes

Le GridView doit être placé à l'intérieur d'une balise de formulaire avec runat="server", même si le GridView se trouve dans une balise de formulaire.

<form runat="server" id="f1">
    <div runat="server" id="d">
        grid view:
        <asp:GridView runat="server" ID="g">
        </asp:GridView>
    </div>

    <asp:TextBox runat="server" ID="t" TextMode="MultiLine" Rows="20" Columns="50"></asp:TextBox>
</form>

Code derrière :

public partial class ScriptTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        g.DataSource = new string[] { "a", "b", "c" };
        g.DataBind();

        TextWriter tw = new StringWriter();
        HtmlTextWriter h = new HtmlTextWriter(tw);    
        d.RenderControl(h);
        t.Text = tw.ToString();
    }
}

Même si le GridView se trouve dans une balise from avec runat="server", je reçois toujours cette erreur.

Des indices, s'il vous plaît ?

165voto

Tim Schmelter Points 163781

Vous appelez GridView.RenderControl(htmlTextWriter) La page soulève donc une exception car un Server-Control a été rendu en dehors d'un formulaire.

Vous pourriez éviter cette exécution en surchargeant VerifyRenderingInServerForm

public override void VerifyRenderingInServerForm(Control control)
{
  /* Confirms that an HtmlForm control is rendered for the specified ASP.NET
     server control at run time. */
}

Voir aquí y aquí .

28voto

Chris Mullins Points 2936

Une alternative à la surcharge de VerifyRenderingInServerForm est de retirer la grille de la collection de contrôles pendant que vous effectuez le rendu, puis de la rajouter lorsque vous avez terminé avant le chargement de la page. Cette solution est utile si vous souhaitez disposer d'une méthode d'aide générique pour obtenir le html de la grille, car vous n'avez pas à vous souvenir d'ajouter la surcharge.

Control parent = grid.Parent;
int GridIndex = 0;
if (parent != null)
{
    GridIndex = parent.Controls.IndexOf(grid);
    parent.Controls.Remove(grid);
}

grid.RenderControl(hw);

if (parent != null)
{
    parent.Controls.AddAt(GridIndex, grid);
}

Voici une autre solution pour éviter le contournement :

grid.RenderBeginTag(hw);
grid.HeaderRow.RenderControl(hw);
foreach (GridViewRow row in grid.Rows)
{
    row.RenderControl(hw);
}
grid.FooterRow.RenderControl(hw);
grid.RenderEndTag(hw);

14voto

Ivan Nikolov Points 453

Juste après votre Page_Load, ajoutez ceci :

public override void VerifyRenderingInServerForm(Control control)
{
    //base.VerifyRenderingInServerForm(control);
}

Notez que je ne fais rien dans la fonction.

EDIT : Tim a répondu à la même chose :) Vous pouvez également trouver la réponse Ici

2voto

Daniel Edwards Points 399

Je veux juste ajouter une autre façon de faire. J'ai vu de nombreuses personnes sur divers fils de discussion connexes demander si vous pouvez utiliser VerifyRenderingInServerForm sans l'ajouter à la page parente.

En fait, vous pouvez le faire, mais c'est un peu compliqué.

Tout d'abord, créez une nouvelle classe Page qui ressemble à ce qui suit :

public partial class NoRenderPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    { }

    public override void VerifyRenderingInServerForm(Control control)
    {
        //Allows for printing
    }

    public override bool EnableEventValidation
    {
        get { return false; }
        set { /*Do nothing*/ }
    }
}

Il n'est pas nécessaire qu'un .ASPX lui soit associé.

Ensuite, dans le contrôle que vous souhaitez rendre, vous pouvez faire quelque chose comme ce qui suit.

    StringWriter tw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(tw);

    var page = new NoRenderPage();
    page.DesignerInitialize();
    var form = new HtmlForm();
    page.Controls.Add(form);
    form.Controls.Add(pnl);
    controlToRender.RenderControl(hw);

Vous avez maintenant votre contrôle original rendu en HTML. Si vous en avez besoin, remettez le contrôle dans sa position d'origine. Vous avez maintenant le rendu HTML, la page comme normale et aucun changement à la page elle-même.

0voto

vipin Points 9

Voici mon code

protected void btnExcel_Click(object sender, ImageClickEventArgs e)
    {
        if (gvDetail.Rows.Count > 0)
        {
            System.IO.StringWriter stringWrite1 = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter htmlWrite1 = new HtmlTextWriter(stringWrite1);
            gvDetail.RenderControl(htmlWrite1);

            gvDetail.AllowPaging = false;
            Search();
            sh.ExportToExcel(gvDetail, "Report");
        }
    }

    public override void VerifyRenderingInServerForm(Control control)
    {
        /* Confirms that an HtmlForm control is rendered for the specified ASP.NET
           server control at run time. */
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X