我在ASP.NET中阅读了关于动态控件创建的这段文字:
...使用动态控件时,你 必须记住它们会存在 直到下一次回发。 ASP.NET 不会重新创建动态添加 控制。如果你需要重新创建一个 你应该多次控制 执行控件创建 Page.Load事件处理程序。这有 允许你的额外好处 使用您的动态视图状态 控制。即使视图状态是 通常在Page.Load之前恢复 event,如果你在中创建一个控件 Page.Load事件的处理程序, ASP.NET将应用任何视图状态 它之后的信息 Page.Load事件处理程序结束。这个 流程是自动的 ...
我想在示例中尝试一下 以声明方式创建一个按钮 -
<asp:Button ID="Button1" runat="server" Text="Button"
onclick="Button1_Click" />
并动态显示代码5后面的复选框 -
protected void Page_Load(object sender, EventArgs e)
{
for (int i = 0; i <= 5; i++)
{
var chBox = new HtmlInputCheckBox();
Controls.Add(chBox);
}
}
但是当我检查一些复选框并按下按钮后,回复所有复选框 国家被抹去了。这意味着ASP.NET不管理动态控件的视图状态 自动?我试图为每个复选框和整页启用视图状态, 但它不起作用。 有人能解释一下: 1.为什么会这样? 2.如何避免这种情况?
答案 0 :(得分:2)
发生这种情况的原因是,为了使ASP.NET恢复POSTed值,这些控件需要在Load之前成为页面的一部分。为了完成这项工作,您需要(如果可能的话)创建页面的控件OnInit。
答案 1 :(得分:0)
您必须为每个动态控件设置一个ID,以便它们可以在回发中同步。
答案 2 :(得分:0)
可以在Page_Init上创建控件。
protected void Page_Init(object sender, EventArguments e)
{
//Generate the checkboxes dynamically here.
CheckBox c;
for (int i = 0; i < 5; i++) {
c = new CheckBox();
c.ID = "Checkbox" + i.ToString();
divContainer.Controls.Add(c); //create a div with runat="Server" attribute or use an asp:Panel, etc. container controls.
}
}
之后,再次尝试单击该按钮,将始终保持状态。
答案 3 :(得分:0)
据我了解 - 无论在OnInit还是OnLoad中创建控件都无处可去
(但有些书在onLoad中建议),问题在于放置它们 - 如果
你通过Controls.Add放置它 - 它将它们放在<form></form>
之外,所以回发
不接受控制的状态。在<form></form>
内创建一个占位符并向该占位符添加动态控件后,开始工作正常。