从任何子表单访问现有的主winform实例

时间:2013-08-21 20:09:40

标签: c# winforms

我正在使用WinForm应用程序。我有几个表格。我希望能够从任何子表单访问我的主表单。我能够通过自定义按钮功能执行此操作并捕获Form_Closing事件。我有一个问题,我将在下面解释。

主表单上的代码如下:

ChildForm form = new ChildForm(); // Create new Child Form instance
form.Show(); // Show Child form
this.Hide(); // Hide Main form

使用“this.Hide();”意味着主窗体仍然存在于内存中并且仍在工作,它只是隐藏了我想要的东西。

子表单上的代码

MainForm form = new MainForm(); // Create new Main Form instance
form.Show(); // Show Main Form
this.Close(); // Close Child Form

这很好,除了我的第二个代码块(上面的子窗体),第一行代码,创建一个主窗体的新实例。这是我的问题,我不想创建该表单的新实例,我想显示已经存在的隐藏实例(我隐藏在上面第一个代码块中的主要表单)。

我在子表单上尝试了以下代码:

this.Parent.Show();

但是我收到了这个运行时错误消息: “System.NullReferenceException未处理:Message = Object reference未设置为对象的实例”。

我理解错误的含义,我只是没有代码来创建对该主窗体的对象引用或者如何以任何形式引用它。

请提示?

非常感谢。

2 个答案:

答案 0 :(得分:2)

您可以为其他表单创建一个构造函数,该构造函数将窗口作为参数

private Form MyParent { get; set; }
public Form1(Form parent)
{
   MyParent = parent;
}

MyParent.Show();

其中MyParent

形式的属性

您可以通过new ChildForm(this)

拨打此电话

修改

我只是看了,不知道为什么我不能为IWin32Window使用构造函数,但Show有一个重载,其中一个将Owner设置为父窗体

new ChildForm().Show(this);
ChildForm.Owner //returns MainForm (parent)

答案 1 :(得分:1)

应该这样做。因为这些是单线程形式,所以函数将等到你关闭表单后再继续。

ChildForm form = new ChildForm(); // Create new Child Form instance
this.Hide(); // Hide Main form
form.ShowDialog(); // Show Child form, wait for closing
this.Show();

您还可以将ChildForm结束事件附加到MainForm中。

public MainForm()
{
    ChildForm form = new ChildForm();
    form.FormClosed += OnClosed;  
}
public void OnClosed(object sender, EventArgs e)
{
     this.Show();
}