如何将 winform 子表单动态嵌入到主 winform 的选项卡控件中?

Posted

技术标签:

【中文标题】如何将 winform 子表单动态嵌入到主 winform 的选项卡控件中?【英文标题】:How do I dynamically embed a winform subform into the tab control of a main winform? 【发布时间】:2011-05-19 15:08:46 【问题描述】:

有没有一种方法可以将 Winforms 表单对象交给包含选项卡控件的主表单,并让主表单将此表单对象加载到其中一个选项卡中?

另一个问题:表单对象将从不同于主表单的线程实例化。

【问题讨论】:

【参考方案1】:

我认为在不同线程上创建表单时它不会起作用,但您通常可以通过将表单的 TopLevel 属性设置为 False 然后将其添加到选项卡页控件(或任何其他父控件)来执行此操作.

编辑:您还需要将 Visible 属性设置为 True,因为默认情况下表单是隐藏的。

另外,我刚刚尝试过,它确实适用于从另一个线程创建的按钮之类的东西。但是当我使用表单执行此操作时,我得到了一个 InvalidOperationException。

【讨论】:

是否将其添加到标签页的 Controls 集合中? 可以,也可以将Form的Parent属性设置为标签页控件。 顺便说一句,更好的方法是使用 SwDevMan81 建议的 MDI 接口。 MDI 界面按照您的预期处理子窗体的布局和管理。 哟,我想我在 UB 和你一起做了一个 CSE305 项目(哈哈,完全跑题了)。那是 lisp turtle 的 tag 游戏。【参考方案2】:

你想要Multi Document Interface (MDI) tab page browsing这样的东西吗?

【讨论】:

可能。但是主窗体的设计已经有点锁定了。【参考方案3】:

您应该可以从TabPageControls 集合中调用Add。您可能需要相应地设置 AnchorDock 属性,以便控件填充整个表面(假设这是您想要的)。

我不认为从另一个线程创建控件是一个好方法。我敢肯定,只要使用适当的同步机制等,您就完全有能力使这种切换线程安全。但是,所有 UI 元素都具有线程关联性,这意味着一旦创建了 UI 元素,它就属于创建线程。简单地创建(只是一个构造函数调用)可能没有任何问题,但我采取的规则是在 UI 线程上保持 all UI 元素逻辑非常严格。

【讨论】:

您不能只将表单添加到另一个控件。它会抛出异常。您必须首先将其 TopLevel 属性设置为 False。

以上是关于如何将 winform 子表单动态嵌入到主 winform 的选项卡控件中?的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 嵌套子表单链接到主(父)表单

Access 2007 使用选项卡将多个子表单链接到主表单的最佳方式

Angular 表单:如何动态添加/删除子表单组件

如何将 HTML/JavaScript 从嵌入式资源加载到 winform Web 浏览器

C++/CLI:将 MFC 嵌入 WinForm

将标签页动态添加到页面控件并嵌入表单?