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 [c#]


Answers

Una alternativa para anular VerifyRenderingInServerForm es eliminar la cuadrícula de la colección de controles mientras hace el procesamiento, y luego volver a agregarla 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);
Question
<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>

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?




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.