从代码隐藏正确使用新实例化的用户控件

时间:2019-03-28 23:40:16

标签: c# asp.net webforms

我编写了许多用户控件,效果很好,但现在令我沮丧的是,如果我动态添加它们,它们似乎根本不起作用。也就是说,当我将它们直接放入我的ASPX代码中时,它们可以正常工作,但是当我通过new关键字创建它们然后将它们插入某个地方时,效果不佳。

请考虑以下控件:

class MyUserControl: UserControl {
    public string Text { get => this.lblChildLabel; set => this.lblChildLabel = value; } 
}

让我们假设在前面,它只有一个名为lblChildLabel的标签。

如果将上述控件放入代码中,则可以轻松控制它:

// In page_prerender
theControl.Text = "Anything";

它显示正常。

但是,如果要“手动”实例化,例如:

var aNewControl = new MyUserControl();
aNewControl.Text = "Something"; // Exception: MyUserControl's lblChildLabel is not set to an instance of an object

对于任何内置控件,这似乎都不是问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

作为一名优秀的SO公民,我正在报告解决方案。

简而言之,这是错误的:

var aNewControl = new MyUserControl();
aNewControl.Text = "Something";

这是正确的:

var aNewControl = (MyUserControl) Page.LoadControl("~/User Controls/MyControl.ascx");
aNewControl.Text = "Something";

前者没有贯穿正常的生命周期,而后者则正常。