如何在关闭 Form2 时立即调用 Form1 中的操作

How to instantly call action in Form1 on closing Form2

所以基本上我有 Form1

我可以从 Form1 使用此代码打开 Form2

    private void btn_Komplexity_Click(object sender, EventArgs e)
    {
        Form2 kompleksaForma = new Form2();
        kompleksaForma.ShowDialog();
    }

打开Form2时有东西,最后有this.Close();

this.Close();(关闭 Form2)之后是否可以调用 Form1 上的即时操作?

如果您坚持使用 ShowDialog(),此函数将阻塞,直到表单关闭。

private void btn_Komplexity_Click(object sender, EventArgs e)
{
     using (Form2 kompleksaForma = new Form2())
     {
         kompleksaForma.ShowDialog();
         PutStuffHereAfterClose();  // (or outside the using block if it doesn't need
                                    //  to access properties of kompleksaForma)
     }
}

关闭window后触发了一些事件。您可以订阅它们并将您的代码添加到处理程序方法中:

Form2 kompleksaForma = new Form2();

kompleksaForma.FormClosing += KompleksaForma_FormClosing;
kompleksaForma.FormClosed += KompleksaForma_FormClosed;
kompleksaForma.Deactivate += KompleksaForma_Deactivate;

kompleksaForma.ShowDialog();

然后像这样实现其中一个处理程序:

private void KompleksaForma_FormClosing(object sender, FormClosingEventArgs e)
{
    // Your code here
}

private void KompleksaForma_FormClosed(object sender, FormClosedEventArgs e)
{
    // or here
}

private void KompleksaForma_Deactivate(object sender, EventArgs e)
{
    // or here
}

首先会触发FormClosing,然后FormClosed。最后一个是 Deactivate.

如果您使用 form2.ShowDialog()form2.ShowDialog(this) 将 Form2 显示为模式 window,那么...

form2.ShowDialog(this);
if (form2.DialogResult == DialogResult.OK)
{
    CallOtherStuffHere();
}

...因为ShowDialog()方法会阻塞执行直到Form2关闭,然后继续。

我正在使用上面的 DialogResult 来测试有效性,但如果您愿意,您可以实现一些其他方法。

如果您将 Form2 显示为非模态 window,那么您应该首先将 Form1 的引用传递给 Form2。这可以在其构造函数中完成...

var form2 = new Form2(form1);

或者,您可以在 Show() 方法中传递它,以将 form1 设置为其父级...

var form2 = new Form2();
form2.Show(form1);

然后,您可以通过form2.Parent访问父表单。但是,在显式调用方法之前,您可能必须将其强制转换为 Form1 实例。这可以在 Form2 的 Closing 事件处理程序中完成。

这里有关于模态和非模态的更多信息windows: https://msdn.microsoft.com/en-us/library/aa984358(v=vs.71).aspx