GridView debe colocarse dentro de una etiqueta de formulario con runat = “server” incluso después de que GridView esté dentro de una etiqueta de formulario

grid view:

Código detrás:

 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(); } } 

Incluso el GridView está dentro de una etiqueta from con runat = “server”, aún obtengo este error.

Alguna pista, por favor?

Está llamando a GridView.RenderControl(htmlTextWriter) , por lo tanto, la página genera una excepción de que Server-Control se procesó fuera de un Formulario.

Puede evitar esta excepción anulando VerifyRenderingInServerForm

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

Mira aquí y aquí .

Una alternativa para anular VerifyRenderingInServerForm es eliminar la cuadrícula de la colección de controles mientras hace el renderizado, y luego agregarlo cuando haya terminado antes de que se cargue la página. Esto es útil si desea tener algún método de ayuda genérico para obtener grillas html porque no tiene que recordar agregar la anulación.

 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); } 

Otra alternativa para evitar la anulación es hacer esto:

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

Justo después de su Page_Load, agregue esto:

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

Tenga en cuenta que no hago nada en la función.

EDITAR: Tim respondió lo mismo. 🙂 También puedes encontrar la respuesta Aquí

Solo quiero agregar otra forma de hacer esto. He visto a varias personas en varios hilos relacionados preguntar si puede usar VerifyRenderingInServerForm sin agregarlo a la página principal.

En realidad puedes hacer esto, pero es un poco bodge.

Primero, cree una nueva clase de página que se parezca a la siguiente:

 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*/ } } } 

No necesita tener un .ASPX asociado.

Luego, en el control que desea representar, puede hacer algo como lo siguiente.

  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); 

Ahora tienes tu control original representado como HTML. Si es necesario, vuelva a agregar el control a su posición original. Ahora tiene el HTML procesado, la página es normal y no tiene cambios en la página.

Aquí está mi código

 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. */ }