动态控件创建

时间:2009-04-15 15:21:11

标签: asp.net

我在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.如何避免这种情况?

4 个答案:

答案 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>内创建一个占位符并向该占位符添加动态控件后,开始工作正常。