窗体中关闭按钮被点击时的事件处理程序

3

我想知道在Windows窗体中,当用户单击关闭按钮时是否有任何事件处理程序。我的初始计划是,当用户单击关闭按钮时,它将向调用该窗体的调用者返回一个布尔值。例如:

public void newWindow(){

      NewForm nw = new NewForm();
      nw.ShowDialog();
      if(nw.isClosed){
       do something
   }

}

这可行吗?

从窗体订阅FormClose或FormClosing事件。 - Zenwalker
System.Windows.Forms类公开了一些事件。请查阅其MSDN,您将了解如何获取窗体关闭事件的一些想法。 - Zenwalker
3个回答

5
如果您使用的是.ShowDialog(),您可以通过DialogResult属性获取结果。
public void newWindow()
{
    Form1 nw = new Form1();
    DialogResult result = nw.ShowDialog();
    //do something after the dialog closed...
}

然后在Form1的点击事件处理程序中:

private void buttonOk_Click(object sender, EventArgs e)
{
     this.DialogResult = DialogResult.OK;
}

private void buttonCancel_Click(object sender, EventArgs e)
{
     this.DialogResult = DialogResult.Cancel;
}

如果您不想将新表单作为对话框打开,可以这样做:
public void newWindow()
{
    Form2 nw = new Form2();
    nw.FormClosed += nw_FormClosed;
    nw.Show();
}

void nw_FormClosed(object sender, FormClosedEventArgs e)
{
    var form = sender as Form2;

    form.FormClosed -= nw_FormClosed; //unhook the event handler

    //you can still retrieve the DialogResult if you want it...
    DialogResult result = form.DialogResult;
    //do something
}

在方法buttonOk_Click()中,我可以使用窗体关闭事件来代替buttonOk_Click()吗? - user962206
谢谢,它起作用了!我从来不知道ShowDialog()会返回一个DialogResult。 - user962206

1
你应该看一下FormClosing事件,或者既然你正在使用ShowDialog,你可以像这样做。你也可以在FormClosing事件中更改返回的DialogResult
DialogResult dr = nw.ShowDialog();
if (dr == DialogResult.Cancel)
{
    //Do Stuff
}

1
你可以在NewForm的FormClosing方法中更改DialogResult,并使用我展示的代码进行测试。当你点击X关闭窗体时,默认的DialogResult是Cancel。 - Mark Hall

0

你已经快完成了!

你不需要 if(nw.isClosed),当 nw 关闭时,do something 这一行将会被执行。

如果你需要从对话框中 '返回' 一个值,请注意:关闭对话框后,它不会立即释放。所以你可以像这样做:

NewForm nw = new NewForm();
nw.ShowDialog();
var x = nw.Property1

这只是一个示例,如果您想从其他表单访问值,可以使用它。否则,您可以将其替换为doSomething()方法调用或任何其他适合您需求的内容。当对话框表单关闭时,它将被执行。 - Mathieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接