即使GridView在表单标记内,GridView也必须放在带有runat ="server"的表单标记内

tee*_*nup 84 .net c# asp.net

<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>
Run Code Online (Sandbox Code Playgroud)

代码背后:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

即使GridView在runat ="server"的from标签内,我仍然会收到此错误.

请问有什么线索吗?

Tim*_*ter 165

您正在调用GridView.RenderControl(htmlTextWriter),因此该页面引发了一个异常,即Server-Control是在Form外部呈现的.

您可以通过覆盖VerifyRenderingInServerForm来避免此异常

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

看到这里这里.

  • 工作得很好.只是抬头你可能会收到一条错误,说"只能在Render()期间调用RegisterForEventValidation;" 如果这样设置,请确保在页面的标记中将EventValidation设置为false. (2认同)

Chr*_*ins 27

覆盖VerifyRenderingInServerForm的替代方法是在执行渲染时从控件集合中删除网格,然后在页面加载之前完成后将其添加回来.如果您想要一些通用的帮助方法来获取网格html,这很有用,因为您不必记住添加覆盖.

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);
}
Run Code Online (Sandbox Code Playgroud)

避免覆盖的另一种方法是:

grid.RenderBeginTag(hw);
grid.HeaderRow.RenderControl(hw);
foreach (GridViewRow row in grid.Rows)
{
    row.RenderControl(hw);
}
grid.FooterRow.RenderControl(hw);
grid.RenderEndTag(hw);
Run Code Online (Sandbox Code Playgroud)

  • 1.如果gridview包含像LinkBut​​ton这样的控件,则它不起作用 - 它给出'类型控制'LinkBut​​ton'必须放在一个带有runat = server'错误的表单标签内.你能解释一下为什么这种技术有用吗? (3认同)

Iva*_*lov 14

在你的Page_Load添加之后:

public override void VerifyRenderingInServerForm(Control control)
{
    //base.VerifyRenderingInServerForm(control);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在该功能中没有做任何事情.

编辑:蒂姆回答同样的事情.:)你也可以在这里找到答案