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

3

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

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

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

我有点知道我的方法是错误的以及为什么是错误的,但不知道如何最好地解决它!有人可以帮忙吗?


2
动态控件必须在每个 postback 上重新创建,这是一个关于如何保持动态控件及其状态的好链接。http://www.singingeels.com/Articles/Dynamically_Created_Controls_in_ASPNET.aspx - Richard Friend
@Richard,点赞,因为这是使它起作用的唯一方法。你应该将其改为回答而不是评论。 - Cylon Cat
4个回答

7

每次回发都必须重新创建动态控件,这篇文章是关于如何保持动态控件及其状态的好链接。


2
链接已经损坏。 - Toolkit

2

如果您想在PostBack中访问控件或者想要绑定事件,那么您需要在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
Page_Init中创建你的控件,然后在Button_Click事件中将其可见。
(从上周我回答的某个问题复制):所有需要在页面周期之间保持的内容都应该在Page_Init中声明,而不是在Page_Load中声明。
所有初始化工作,例如添加事件处理程序和添加控件,都应该在初始化期间完成,因为状态在页面周期之间保存。处理控件内容和视图状态应该在Load中完成。
也请查看http://msdn.microsoft.com/en-us/library/ms178472.aspx

Init

在所有控件已初始化并应用了任何皮肤设置之后引发。使用此事件来读取或初始化控件属性。

.

Load

页面调用页面上的OnLoad事件方法,然后递归地对每个子控件执行相同的操作,直到加载完页面和所有控件为止。

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


1

两种可能的方法:

  1. 在页面中拥有控件,但在单击按钮之前不加载任何内容。然后可以填充控件中的值。这样做的好处是在页面生命周期内完成。请注意,您始终可以为用户控件所在的
    使用“display: none”样式设置。然后,在按钮的 OnClick 中,可以显示该
    并使您的控件可见。
  2. 您可以弹出另一个窗口,但显然这可能会被弹出窗口拦截器阻止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接