【问题标题】:Getting parent form name of a form获取表单的父表单名称
【发布时间】:2014-03-02 19:04:02
【问题描述】:

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

我怎样才能知道哪一个是 form3 的父级?

【问题讨论】:

  • 如何“打开”form3? form3 是如何以及在哪里实例化的,它是如何从 form1 和 form2 中引用的?一些源代码会很有帮助。
  • 请不要在标签中包含 IDE 标签(Visual Studio),如果您的问题不是直接与它有关,而您只是在其中编写代码。代码问题很少与代码编辑器相关联。

标签: c# winforms


【解决方案1】:

“父”一词在 Windows 中有非常严格的定义。与所有 UI 类一样,Form 类派生自 Control,但它非常不同,它是一个顶级窗口。与其他控件(如 Button 和 TextBox)非常不同,它们是父窗口中的子窗口。 Form 的父级是桌面窗口,您不太可能对它感兴趣。

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

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

   var toolWindow = new Form3();
   toolWindow.Show(this);

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

这不太可能是您真正谈论的内容,Winforms 通常是程序员第一次介绍面向对象编程,并且处理对象引用常常令人困惑。如果您需要对 Form3 中的 logical 父级的引用,那么只需编写代码以便传递该父级。你通过给 Form3 类一个构造函数来做到这一点:

   private Form logicalParent;

   public Form3(Form parent) {
       InitializeComponent();
       logicalParent = parent;
   }

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

   var form = new Form3(this);
   form.Show();

您可以通过为 Form1 和 Form2 设计一个基类以面向对象的方式进一步改进此代码,该基类具有像 Form3 这样的类会感兴趣的共同成员。或者更好的是,两个 Form1 的接口和 Form2 实现,大大减少了耦合。最后但同样重要的是,使用 events 允许 Form3 通知其逻辑父级。可能是您真正想要的。

【讨论】:

    【解决方案2】:

    您可以像这样从 Child 访问 Parent 表单,

    说 MainForm 是 Form1

    MainForm parent = (MainForm)this.Owner;
    

    或者如果你想从层次结构中找到Parent,

    在 Form1 中,您在某处实例化 Form2 并在 ctor 中传递对 Form1 的引用:

    Form2 f2 = new Form2(this);
    

    在Form2的类定义中添加一个字段:

    private Form1 m_form = null;
    

    在第二个表单的构造函数中设置该字段:

    public Form2(Form1 f)
    {
       m_form = f;
    }
    

    【讨论】:

      【解决方案3】:

      在您的 Form3 中,您可以这样做:

          var form1 = this.Parent as Form1;
          if(form1 != null)
          {
             //form1.Text
          }
      
      
          var form2 = this.Parent as Form2;
          if(form2 != null)
          {
             //form2.Text
          }
      

      【讨论】:

      • 为什么要检查所有isas!=null?最后两个就够了。不要在这里使用is
      • 这是假设form3 插入到Controls 集合中的form1form2。通常“打开”表单不需要这样做,您只需在其他表单的某处使用form3Show 方法。
      【解决方案4】:

      通常我通过

      获得控制的父级名称
      MessageBox.Show(control_Name.Parent.Name);
      

      但是现在我们正在寻找表单的 Parent,所以我们不能使用相同的方法,因为我们甚至不需要真正的 Parent 和 Client 关系来调用表单。所以当我们这样做时我们会有 NullReferenceException

      MessageBox.Show(this.Parent.Name);
      

      在 Form3 中。

      通过在 Form 1 和 Form2 和 Form3 中执行这些操作,我可以从两个表单中调用 Form3。

      表格1

          Form3 frm3;
          public Form1()
          {
              InitializeComponent();
              frm3 = new Form3(this);
          }
      
          private void button1_Click(object sender, EventArgs e)
          {
              frm3.Show();
          }
      

      表格2

          Form3 frm3;
          public Form2()
          {
              InitializeComponent();
              frm3 = new Form3(this);
          }
      
          private void button1_Click(object sender, EventArgs e)
          {
              frm3.Show();
          }
      

      Form3

          public Form3(Form parent)
          {
              InitializeComponent();
          }
      

      作为我的结论,如果父窗体只能有一个,那么Form1和Form2都是不是 Form3父窗体,因为其中一个不存在,但另一个仍然可以调用Form3。如果父窗体可以有多个,那么我认为Form1和Form2都是Form3的父窗体。


      顺便说一下,如果Parent Form最小化了,Child Form也被最小化了,那么我们可以将Form1设为Form3的Parent Form(或者实际上是owner form

      表格1

          Form3 frm3;
          public Form1()
          {
              InitializeComponent();
              frm3 = new Form3(this);
              this.AddOwnedForm(frm3);
          }
      

      我们将 Form3 的 owner 设置为 调用它的表单

      Form3

          public Form3(Form parent)
          {
              InitializeComponent();
              this.Owner = parent;
          }
      

      如果你不同意我的观点,请给我明确的定义父表格子表格。谢谢。我试着从我的角度来解释,如果我错了,希望有人纠正我。

      【讨论】:

        猜你喜欢
        • 2010-09-19
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        • 1970-01-01
        • 2015-10-26
        • 1970-01-01
        • 2023-04-02
        • 2021-05-06
        相关资源
        最近更新 更多