如何在关闭 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
所以基本上我有 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