.NET Windows窗体 - 拦截Close X事件

时间:2010-05-10 15:24:07

标签: .net winforms

这一定是个愚蠢的问题,但我无法弄清楚。我也无法使用设计器,因为在我之前的编码器设法将GUI和逻辑全部集中在一起,所以现在它很困惑。我必须按照旧学校的方式去做。

我有一个可以通过3种方式关闭的表格:关闭按钮,文件/关闭菜单和X图标。我希望他们都做同样的事情。拦截按钮和菜单事件很容易。事实上,两者都与onCloseConfig方法联系在一起。顺便问一下,这个方法有更好的名称吗?

private void onCloseConfig(object sender, System.EventArgs e)
{
    if (! m_configControl.Modified)
    {
        Application.Exit(); // Or should it be this.Close();
    }
    ....
    // Else present a dialog, ask if they want to save.
}

所以,拦截我试过的Xthis.FormClosing +=new FormClosingEventHandler(this.onCloseConfig);我相信这是导致无限循环的原因。我不希望:) FormClosed是另一种选择,但似乎为时已晚。我只想拦截点击X的事实,而不是表格正在关闭的事实。

5 个答案:

答案 0 :(得分:12)

我认为你确实希望关闭表单,你可能缺少的是检查关闭的原因,只有来自用户才取消它。例如

private void my_FormClosing(object sender, FormClosingEventArgs e)
{
  if (e.CloseReason == CloseReason.UserClosing)
  {
    e.Cancel = true; //I'm sorry Dave, I'm afraid I can't do that.
  }
}

隐藏'X'集Form.ControlBox = false,但这也将消除最小/最大。

答案 1 :(得分:3)

为按钮/菜单关闭创建单独的方法:

private void myButton_Click(object sender, EventArgs e)
{
    this.Close();
}

private void myMenuButton_Click(object sender, EventArgs e)
{
    this.Close();
}

private void myForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (m_configControl.Modified)
    {
        var result = MessageBox.Show("Name Of Application", "Would you like to save before closing?", MessageBoxButtons.YesNoCancel);
        if(result == DialogResult.Yes)
            //Save here
        else if(result == DialogResult.Cancel)
            e.Cancel = true;
    }
}

或者,您可以通过设置this.ControlBox = false

完全禁用关闭按钮(“X”)

答案 2 :(得分:1)

  顺便问一下,这有更好的名字吗?   方法

关闭[FormName]可能是更好的选择。

  

或者应该是this.Close();

是的,如果你想要的只是关闭表格。

您应该为FormClosing事件创建一个新的事件处理程序。它接受FormClosingEventArgs而不是EventArgs作为参数。在按钮和菜单项的单击处理程序中,只需执行此操作。关闭()。

这将调用该事件,您可以将所有支票放在那里。

答案 3 :(得分:1)

表单关闭后会出现FormClosed event。这绝对不是你想要的。

FormClosing event更有可能是您需要的。

无论单击任何按钮或菜单链接,都会触发FormClosing事件。尝试关闭表单的任何内容都将触发FormClosing事件。

现在,在FormClosing事件处理程序方法中使用FormClosingEventArgs的更合适的方法如下:

if(m_configControl.Modified)
    e.Cancel = true;

因此,除非修改配置控件,否则表单将继续关闭。您希望仅在存在更改或未保存的更改时阻止其关闭。

编辑2 在重新阅读您的问题之后,请参阅下面我对更高代码的更改:

if(m_configControl.Modified)
    if(DialogResult.OK == MessageBox.Show("Do you want to save changes?", "Changes detected")
        SaveChanges();

然后,这将提示用户进行未保存的更改,并仅在用户在MessageBox中单击“确定”时保存。请注意,您必须在MessageBox.Show()方法的其他参数中相应地添加按钮。

如果您想在FormClosing上完成是/否/取消,那么您必须采用这种方式:

if(m_configControl.Modified) {
    DialogResult dr = MessageBox.Show(...);
    switch(dr) {
        case DialogResult.OK:
            SaveChanges();
            break;
        case DialogResult.No:
            // Do nothing...
            break;
        case DialogResult.Cancel:
            e.Cancel = true;
    }
}

因此,当用户单击“是”时,您的应用程序将保存更改。当他点击否时,应用程序将不会对此做任何事情,并将继续关闭。当用户希望返回应用程序时,将阻止关闭。

编辑1 请留意我对This Question的回答,这似乎是您想要完成的事情。

答案 4 :(得分:0)

这会阻止窗口关闭: FormClosing(对象发送者,System.EventArts e) { if(e.CloseReason == CloseReason.UserClosing)       e.Cancel = true; }