【问题标题】:Dynamic control creation动态控制创建
【发布时间】:2009-04-16 08:54:38
【问题描述】:

我读到了关于在 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. 如何避免?

【问题讨论】:

  • 嗨。在我的评论中查看更新的代码,希望它有效。如果没有,请给我写评论,我会看看是否可以提供帮助。

标签: asp.net


【解决方案1】:

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

【讨论】:

  • private void Page_Init(object sender, System.EventArgs e) { for (int i = 0; i
  • 正如 OP 所引用的,这已经适用于在 PageLoad 中创建的控件
【解决方案2】:

可以在 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.
  }
}

之后,再次尝试点击按钮,状态会一直保持。

【讨论】:

  • 我按照你和 Andrew Hare 说的做了,但没有变化,我可以在这里的某个地方发布我的 aspx 吗?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    据我了解 - 无论在 OnInit 或 OnLoad 中创建控件的位置 (但有些书在 onLoad 中建议),问题在于放置它们的位置 - 如果 您通过 Controls.Add 放置 - 它会将它们放在 &lt;form&gt;&lt;/form&gt; 之外,所以回发 不采取控制的状态。在 &lt;form&gt;&lt;/form&gt; 内创建占位符并向该占位符添加动态控件后,一切都开始正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 2011-06-10
      • 2011-06-27
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多