获取表单的父表单名称

时间:2014-03-02 06:20:22

标签: c# winforms

我有一个Form(form3),可以从另外两种形式打开。 Form1和Form2。

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

4 个答案:

答案 0 :(得分:4)

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

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

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

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

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

你真正在谈论的是不太可能的事情,Winforms经常是程序员对面向对象编程的第一次介绍,处理对象引用通常会让人感到困惑。如果您需要在Form3中引用逻辑父级,那么只需编写代码即可传递该父级。通过为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实现,显着减少耦合。最后但并非最不重要的是,使用事件以允许Form3通知其逻辑父级。可能你真正想要的是什么。

答案 1 :(得分:2)

您可以像这样从孩子那里访问父表单,

Say 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;
}

答案 2 :(得分:0)

在Form3中,你可以这样做:

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


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

答案 3 :(得分:0)

通常我会通过

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

但是现在我们找到了表单的Parent,所以我们不能使用相同的方法,因为我们甚至不需要有真正的Parent和Client关系来调用Form。因此,当我们执行

时,我们将会有 NullReferenceException
MessageBox.Show(this.Parent.Name);
Form3中的

通过在Form 1和Form2以及Form3中执行这些操作,我可以从两种形式调用Form3。

Form1中

    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的父表单。


顺便说一句,如果父表单最小化,子表单也最小化,那么我们可以将Form1设为Form3的父表单(或实际所有者表单)< / p>

Form1中

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

或者

我们将Form3的所有者设置为通过

调用的表单

Form3

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

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