在Compact Framework中获取Component的父容器

时间:2013-01-30 17:22:19

标签: c# .net compact-framework system.componentmodel

我基本上需要做同样的事情: Get Component's Parent Form

但是在紧凑框架中没有

的定义
IDesignerHost

知道怎么做吗?

编辑: 它是System.ComponentModel.Component派生的组件,我想放在一些System.Windows.Forms.Container控件上。 我需要引用的原因是我不想在我将组件放入的每个表单中为我的组件手动设置父容器。

1 个答案:

答案 0 :(得分:0)

在Compact Framework中,Form的组件包含在成员Container变量中。除了Form创建实例的事实之外,该Container与Form本身之间没有直接关系。对于这个问题,该实例可以很容易地传递给其他Form或非Form类,以及原始父级Disposed。

这意味着无法确定组件的“包含表单”。这些信息根本没有存储在任何地方(GC看到了根,但这有点不同,无论如何都无法查询。)

现在,如果你只想要一个IContainer的引用,而不是那个将实例保存到IContainer的Form,你可以查询component.Site.Container,但即使这样也有很多潜在的漏洞。

例如,如果将SerialPort组件拖放到表单上,设计器会将其添加到组件集合中,并设置serialPort.Site.Container。但是,如果将Timer组件拖放到Form上,则Timer 不会添加到Components集合中,因此timer.Site实际上是null,所以即使尝试查询Container也是如此会抛出NullReferenceException。

为了使它更有趣,像SerialPort这样的组件也有允许在没有IContainer的情况下创建的构造函数,因此如果开发人员手动创建SerialPort,将SerialPort放到设计器中的Form上会将其添加到Form的组件中,它很少会被添加到Components集合中。

基本上,我认为您需要重新考虑您的预期架构。您将不得不想出一些不依赖于父容器的机制。