C# 以编程方式在ASP.NET中添加用户控件

C# 以编程方式在ASP.NET中添加用户控件,c#,asp.net,user-controls,C#,Asp.net,User Controls,我有一个用户控件,单击按钮时需要加载子控件。 问题是它必须从另一个类请求控件 因此,在button click事件中,我调用函数获取我的控件,并将其添加到页面中,如下所示: UserControl ctrl = ExampleDataProvider.GetControl(some params...); myDetailPane.Controls.Add(ctrl); GetControl方法如下所示: public static UserControl GetControl(some pa

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

因此,在button click事件中,我调用函数获取我的控件,并将其添加到页面中,如下所示:

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;
        }
由于页面的生命周期,此操作不起作用-子控件的页面加载被触发,其控件为空


我有点知道我的方法是错误的,为什么,但不知道最好的方法去解决它!有人能帮忙吗?

有两种可能的方法:

  • 将控件放在页面中,但在他们单击按钮之前不加载任何内容。然后可以填充控件中的值。这样做的好处是在页面生命周期内。注意,对于用户控件所在的,始终可以使用“显示:无”样式设置。然后,作为按钮OnClick的一部分,可以显示div使控件可见
  • 你可以弹出另一个窗口,尽管很明显这有可能被弹出窗口拦截器阻止

  • 若要在回发中访问控件或绑定事件,必须在CreateChildControls()方法中创建它们

    private UserControl\u uc=null;
    /// 
    ///创建所有控件。
    /// 
    ///必须在此方法中为事件处理程序创建所有控件
    受保护的覆盖无效CreateChildControls()
    {
    _uc=新用户控件();
    this.Controls.Add(_uc);
    base.CreateChildControls();
    }
    
    每次回发都必须重新创建动态控件,这是一个关于如何持久化动态控件及其状态的好链接

    Page\u Init
    中创建控件。然后将其显示在
    按钮上,单击事件


    (CTRL+C/CTRL+V来自我上周回答的另一个问题):

    页面周期之间必须维护的所有内容都应该在
    page\u Init
    中声明,而不是
    page\u Load
    中声明

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

    也检查一下

    Init

    在初始化所有控件和任何外观后引发 设置已应用。用这个 事件来读取或初始化控件 财产

    加载

    该页调用OnLoad事件方法 在页面上,然后递归地执行 每个子控件都相同,其中 对其每个子对象执行相同的操作 控件,直到页面和所有 控件已加载

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


    每次回发时都必须重新创建动态控件,这是一个关于如何持久化动态控件及其状态的好链接@Richard,+1,因为这是唯一能让这一切成功的方法。你应该回答这个问题而不是发表评论。链接已断开
        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();
        }