2009-04-15 110 views
0

我了解在ASP.NET动态控制创造这片文字:动态控件创建

...当使用动态控件,您 必须记住,他们将存在 只有等到下一次回传。 ASP.NET 将不会重新创建动态添加的 控件。如果您需要多次重新创建一个 控件,则应在 Page.Load事件处理程序中执行控件创建。这有 允许您使用视图状态与您的动态 控制的额外好处。尽管视图状态 通常是Page.Load 事件之前,如果你创建的 处理程序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

嗨。在我的评论中看到更新的代码,希望它能起作用。如果没有,给我写评论,我会看看我能否提供帮助。 – Kirtan 2009-04-15 16:43:03

回答

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. 
    } 
} 

之后,再次尝试点击按钮,状态将始终保持。

2

发生这种情况的原因是因为为了ASP.NET恢复POST的值,这些控件需要在加载之前成为页面的一部分。为了使这项工作,你需要(如果可能的话)创建你的控件OnInit的页面。

+0

private void Page_Init(object sender,System。EventArgs e) {(int i = 0; i <= 5; i ++) var chBox = new HtmlInputCheckBox(); Controls.Add(chBox); }} 没有 报价变化:( – ge1serf 2009-04-15 15:38:13

+0

作为OP,这已经工作在pageLoad的 – 2009-04-15 15:38:23

0

您必须为每个动态控件设置一个ID,以便它们可以跨回发进行同步。

0

按我的理解 - 有无论身在何处的OnInit或的OnLoad 创建控件(但有些书的onLoad建议),事就是将它们放置 - 如果你 通过Controls.Add被地方 - 它将它们放在<form></form>之外,所以回发 不会占用控件的状态。在<form></form>内部创建一个占位符并向此占位符添加动态控件后,开始正常工作。