以编程方式添加控件时,占位符未实例化

4

我有一个声明了Placeholder控件的ASPX页面。

在代码后台中,我创建了一个用户控件并将其添加到Placeholder中。

protected void Page_Load(object sender, EventArgs e)
{
      UserControl uc = new ChartUserControl();
      myForm.Controls.Add(uc);
}

用户控件(UserControl)有一个占位符(Placeholder),但在用户控件的Page_Load事件中,当我执行以下操作:

protected void Page_Load(object sender, EventArgs e)
{
    WebControl x = new WebControl();
    userControlPlaceholder.Controls.Add(x);
}

我遇到了普遍存在的“对象引用未设置为对象实例”的异常。

我尝试通过调用构造函数来强制实例化,但这给我带来了其他麻烦。希望能得到帮助。

2个回答

9

我刚刚花了4个小时研究这个问题。

问题在于你是用以下代码创建用户控件:

ChartUserControl chart = new ChartUserControl();

但是您必须使用LoadControl:

ChartUserControl chart =
   (ChartUserControl)LoadControl("~/path/to/control/ChartUserControl.ascx");

显然,LoadControl初始化用户控件,使其PlaceHolders(以及我认为的其他它包含的控件)在使用时不会为空。

谢谢,谢谢,谢谢 - 这也让我摆脱了一大堆麻烦。 - Jeremy McGee
太好了!我以为我得重新考虑整个项目的方法。 - Lill Lansey
除了 LoadControl() 之外,还有其他实例化 UserControl 的实现吗? - bflemi3

2

不要在Page_Load中添加控件,而是重写CreateChildControls方法并在其中添加控件。


谢谢你的建议,很有道理。不过我还是遇到了完全相同的问题(我把它放在base.CreateChildControls()之后)。 - Chet

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