0

我正在使用 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 not set to an instance of an object”。

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

请问有什么提示吗?

提前谢谢。

4

2 回答 2

2

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

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

MyParent.Show();

MyParent表单的属性在哪里

你可以通过new ChildForm(this)


编辑

我只是看了看,不知道为什么我不能为 an 使用构造函数,IWin32WindowShow有一个重载,其中将设置Owner为父表单

new ChildForm().Show(this);
ChildForm.Owner //returns MainForm (parent)
于 2013-08-21T20:15:12.103 回答
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();
}
于 2013-08-21T20:14:09.200 回答