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

时间:2010-01-12 15:39:29

标签: c# asp.net user-controls

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

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

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被触发,其控件为空。

我很清楚我的方法是错误的,为什么,但不知道解决它的最佳方法!有人可以帮忙吗?

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

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事件方法进行设置   控制和建立的属性   数据库连接。

答案 2 :(得分:1)

两种可能的方法:

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

答案 3 :(得分: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();
    }