<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)
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)
Iva*_*lov 14
在你的Page_Load添加之后:
public override void VerifyRenderingInServerForm(Control control)
{
//base.VerifyRenderingInServerForm(control);
}
Run Code Online (Sandbox Code Playgroud)
请注意,我在该功能中没有做任何事情.
编辑:蒂姆回答同样的事情.:)你也可以在这里找到答案