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

Posted

技术标签:

【中文标题】以编程方式添加控件时未实例化占位符【英文标题】:Placeholders Not Instantiated when adding Controls Programmatically 【发布时间】:2010-11-09 10:32:10 【问题描述】:

我有一个声明了占位符控件的 ASPX 页面。

在代码隐藏中,我创建了一个用户控件并将其添加到占位符中。

protected void Page_Load(object sender, EventArgs e)

      UserControl uc = new ChartUserControl();
      myForm.Controls.Add(uc);

UserControl 反过来有一个占位符,但在 Page_Load(对于 UserControl)我这样做时:

protected void Page_Load(object sender, EventArgs e)

    WebControl x = new WebControl();
    userControlPlaceholder.Controls.Add(x);

它给了我无处不在的“对象引用未设置为对象的实例”异常。

我尝试通过调用构造函数来强制实例化,但这给我带来了其他麻烦。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我自己只花了 4 个小时。

问题是您正在创建用户控件

ChartUserControl chart = new ChartUserControl();

但你必须使用 LoadControl:

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

显然,LoadControl 初始化了用户控件,以便它的 PlaceHolders(我假设它包含的其他控件)在您使用它们时不会为空。

【讨论】:

谢谢谢谢谢谢 - 这也让我摆脱了一大堆嘟嘟声。 太棒了!我认为我将不得不重新考虑我对这个项目的整个方法。 除了LoadControl() 还有其他实现来实例化UserControl吗?【参考方案2】:

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

【讨论】:

感谢您的提示,很有意义。虽然遇到了完全相同的问题(我把它放在 base.CreateChildControls(); 之后)。

以上是关于以编程方式添加控件时未实例化占位符的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将委托实例化到组件

MonoTouch 以编程方式为 ContainerView 实例化 ViewController

以编程方式(但不是以声明方式)实例化小部件时出现 Dojo 重复 ID 错误

'故事板“ Main”中的标识符为“”的实例化视图控制器,但尝试以模态方式显示视图控制器时未获得UITableView']

以编程方式在Sharepoint中实例化Web部件页面

以编程方式实例化 TableViewController 子类后,它的出口为零