【问题标题】:Get Component's Parent Container in Compact Framework在 Compact Framework 中获取组件的父容器
【发布时间】:2013-01-14 14:52:53
【问题描述】:

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

然而在compact framework中没有定义

IDesignerHost

知道怎么做吗?

编辑: 我想在System.Windows.Forms.Container 控件上放置System.ComponentModel.Component 派生组件。 我需要参考这个的原因是我不想在我将组件拖放到的每个表单中为我的组件手动设置父容器。

【问题讨论】:

  • 什么类型的组件,你创建的?如果不是什么类型?您尝试过什么,为什么需要这样做?
  • 查看我的编辑。我已经尝试了stackoverflow.com/questions/371464/get-components-parent-form 的解决方案,但正如我之前所说,Compact Framework 上没有IDesignerHost 实现

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


【解决方案1】:

在 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 拖放到 Form 时,如果开发人员手动创建 SerialPort,则会将其添加到 Form 的组件中,它很少会被添加到组件集合中。

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

【讨论】:

  • 很公平。谢谢解释
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 2011-05-27
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2010-10-07
相关资源
最近更新 更多