获取表单的父表单名称

nnm*_*mss 1 c# winforms

我有一个可以从其他两个表单打开的表单 (form3)。表格 1 和表格 2。

我怎样才能得到哪一个是form3的父级?

Han*_*ant 5

术语“父”在 Windows 中有非常严格的定义。Form 类像所有 UI 类一样从 Control 派生,但它非常独特,它是一个顶级窗口。与 Button 和 TextBox 等其他控件非常不同,它们是父窗口内的子窗口。窗体的父级是桌面窗口,您不太可能对此感兴趣。

因此,谈论“Form3 的父级”是非常没有意义的,它与 Form1 和 Form2 是同一个父级,它根本无法帮助您区分哪个可能显示了 Form3 窗口。

Windows 确实有一种方法可以将两个顶级窗口相互关联,它具有所有者窗口的概念。它旨在实现工具窗口或对话框,拥有的窗口始终显示在其所有者的顶部,并与其所有者一起最小化。创建一个拥有的窗口很简单:

   var toolWindow = new Form3();
   toolWindow.Show(this);
Run Code Online (Sandbox Code Playgroud)

此 Show() 重载采用指示其所有者的参数,可以是对 Form1 或 Form2 对象的引用,具体取决于此代码出现的位置。在 Form3 类中,您可以使用Owner属性找到所有者。

这不太可能是您真正谈论的内容,Winforms 通常是程序员对面向对象编程的第一个介绍,并且处理对象引用通常令人困惑。如果您需要对Form3 中的逻辑父级的引用,则只需编写代码即可传递该父级。您可以通过为 Form3 类提供一个构造函数来实现:

   private Form logicalParent;

   public Form3(Form parent) {
       InitializeComponent();
       logicalParent = parent;
   }
Run Code Online (Sandbox Code Playgroud)

在 Form1 或 Form2 中创建窗口只需要:

   var form = new Form3(this);
   form.Show();
Run Code Online (Sandbox Code Playgroud)

您可以通过为 Form1 和 Form2 设计一个基类以面向对象的方式进一步改进此代码,该基类具有像 Form3 这样的类可能感兴趣的共同成员。或者更好的是,Form1 和 Form2 都实现的接口,这显着降低了耦合。最后但并非最不重要的一点是,使用事件来允许 Form3 通知其逻辑父级。可能是您真正要寻找的。