【问题标题】:.NET Windows Forms - intercepting the Close X event.NET Windows 窗体 - 拦截 Close X 事件
【发布时间】:2010-05-10 15:24:06
【问题描述】:

这一定是个愚蠢的问题,但我想不通。我也不能使用设计器,因为我之前的编码人员设法将 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.
}

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

【问题讨论】:

    标签: .net winforms


    【解决方案1】:

    我认为您确实想要关闭表单,您可能缺少的是检查关闭的原因,并且只有在来自用户时才取消它,例如

    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,但这也会去掉最小值/最大值。

    【讨论】:

    • 酷!有没有办法完全隐藏 X?
    • 不滚动你自己的窗口镶边。
    • 你可以去掉 min max 并关闭
    • 我还检查了 TaskManagerClosing 和 WindowsShutDown 关闭原因
    • 这可能是一个愚蠢的问题。我们在过去的项目中使用了 FormClosing。在实际中我们也使用了它,但是表单本身在 FormClosing 中的第一行代码执行之前就关闭了。之前有什么可以抓到的吗?
    【解决方案2】:

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

    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”)

    【讨论】:

      【解决方案3】:

      顺便说一句,这个有更好的名字吗 方法?

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

      或者应该是this.Close();

      是的,如果您只想关闭表单。

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

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

      【讨论】:

        【解决方案4】:

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

        FormClosing event 更可能是您需要的。

        无论单击按钮或菜单链接,都会触发 FormClosing 事件。任何试图关闭表单的行为都会触发 FormClosing 事件。

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

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

        所以除非配置控件被修改,否则表单将一直关闭。您希望仅在有更改或未保存的更改时才关闭它。

        EDIT 2重读您的问题后,请参阅下面我对上面代码的更改:

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

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

        如果您想在 FormClosing 时完成 Yes/No/Cancel,那么您必须这样做:

        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 的回答,这似乎正是您想要完成的。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • System.EventArts [原文如此] 或 EventArgs 没有 CloseReason 成员,您需要 FormClosingEventArgs 就像我的回答一样
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-05
          • 2021-06-27
          • 2019-06-04
          相关资源
          最近更新 更多