【问题标题】:Programmatically adding a user control in ASP.NET以编程方式在 ASP.NET 中添加用户控件
【发布时间】:2010-01-12 15:39:28
【问题描述】:

我有一个用户控件需要在单击按钮时加载子控件。 问题是它必须向另一个类请求控制。

所以在按钮单击事件中,我调用该函数来获取我的控制权,并将其添加到页面中,如下所示:

UserControl ctrl = ExampleDataProvider.GetControl(some params...);
myDetailPane.Controls.Add(ctrl);

GetControl 方法如下所示:

public static UserControl GetControl(some params...)
        {
            ExampleDetailPane ctrl = new ExampleDetailPane();
            ctrl.Value = "12";
            ctrl.Comment = string.Empty;
            return ctrl;
        }

由于页面的生命周期,这不起作用 - 子控件的 Page_Load 被触发并且其控件为空。

我有点知道我的方法是错误的以及为什么,但不知道修复它的最佳方法!有人可以帮忙吗?

【问题讨论】:

  • 必须在每次回发时重新创建动态控件,这是关于如何持久化动态控件及其状态的一个很好的链接。 singingeels.com/Articles/…
  • @Richard,+1,因为这是完成这项工作的唯一方法。您应该将此作为答案而不是评论。

标签: c# asp.net user-controls


【解决方案1】:

如果你想在 PostBack 中访问你的控件或者你想绑定 Event,你必须在 CreateChildControls() 方法中创建它们。

    private UserControl _uc = null;

/// <summary>
    /// Creates all controls.
    /// </summary>
    /// <remarks>All the controls must be created in this method for the event handler</remarks>
    protected override void CreateChildControls()
    {
        _uc = new UserControl ();

        this.Controls.Add(_uc);
        base.CreateChildControls();
    }

【讨论】:

    【解决方案2】:

    两种可能的方法:

    1. 在页面中有控件,但在单击按钮之前不会加载任何内容。然后您可以填充控件中的值。这具有在页面生命周期内的好处。请注意,您始终可以为您的用户控件所在的位置使用“显示:无”样式设置。然后,作为按钮的 OnClick 的一部分,您可以显示 div,使您的控件可见。
    2. 您可以弹出另一个窗口,但显然这有可能被弹出窗口阻止程序阻止。

    【讨论】:

      【解决方案3】:

      必须在每次回发时重新创建动态控件,这个Article 是一个关于如何保持动态控件及其状态的很好的链接。

      【讨论】:

      • 链接失效
      【解决方案4】:

      在Page_Init 中创建您的控件。然后让它在您的 Button_Click 事件中可见。


      (上周我回答的其他问题中的CTRL+C/CTRL+V):

      在页面周期之间必须维护的所有内容都应在Page_Init 中声明,而不是在Page_Load 中。

      所有初始化,如添加事件处理程序和添加控件都应该在初始化期间添加,因为状态会在页面周期之间保存。控件内容和视图状态的处理,应在Load 中完成。

      还要检查http://msdn.microsoft.com/en-us/library/ms178472.aspx。

      初始化

      在所有控件已初始化且任何皮肤后引发 已应用设置。用这个 读取或初始化控件的事件 属性。

      .

      加载

      Page 调用 OnLoad 事件方法 在页面上,然后递归地执行 每个子控件都相同,其中 对每个孩子做同样的事情 控制直到页面和所有 控件已加载。

      使用 OnLoad 事件方法设置 控件中的属性并建立 数据库连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-17
        • 2011-12-15
        • 2010-12-13
        • 1970-01-01
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多