我有一个Form(form3),可以从另外两种形式打开。 Form1和Form2。
我怎样才能得到哪一个是form3的父级?
答案 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。因此,当我们执行
时,我们将会有 NullReferenceExceptionMessageBox.Show(this.Parent.Name);
Form3中的。
通过在Form 1和Form2以及Form3中执行这些操作,我可以从两种形式调用Form3。
Form3 frm3;
public Form1()
{
InitializeComponent();
frm3 = new Form3(this);
}
private void button1_Click(object sender, EventArgs e)
{
frm3.Show();
}
Form3 frm3;
public Form2()
{
InitializeComponent();
frm3 = new Form3(this);
}
private void button1_Click(object sender, EventArgs e)
{
frm3.Show();
}
public Form3(Form parent)
{
InitializeComponent();
}
根据我的结论,如果父表单只能有一个,那么Form1和Form2都是不 Form3父表单,因为其中一个不存在而另一个不存在一个仍然可以调用Form3。如果父表单可以包含多个,那么我认为 Form1和Form2都是Form3的父表单。
顺便说一句,如果父表单最小化,子表单也最小化,那么我们可以将Form1设为Form3的父表单(或实际所有者表单)< / p>
Form3 frm3;
public Form1()
{
InitializeComponent();
frm3 = new Form3(this);
this.AddOwnedForm(frm3);
}
我们将Form3的所有者设置为通过
调用的表单 public Form3(Form parent)
{
InitializeComponent();
this.Owner = parent;
}
如果您不同意我的意见,请给我明确定义 父表单和子表单。谢谢。我试着从我的观点来解释,如果我错了,希望有人纠正我。