【问题标题】:Winforms Application.Exit on Closing x app or clicking a Exit Button with a confirmation messageWinforms Application.Exit 关闭 x 应用程序或单击带有确认消息的退出按钮
【发布时间】:2019-09-05 09:21:50
【问题描述】:

我正在开发一个带有 Telerik WinForm (2019.2.618.40) 控件的 WinForms (.NET 4.7.2) 应用程序。

点击窗口顶部的关闭框[x]图标,我想要求用户确认,如果是,则关闭应用程序。

以下代码运行良好,它关闭了窗口,但它不是关闭过程(我仍然可以在任务管理器中看到该应用程序)。

我相信我需要调用Application.Exit(); 来终止应用程序进程。但是当我调用 Closing Event 被触发两次并且我得到两次确认窗口并得到以下错误时

System.InvalidOperationException: '集合已修改; 枚举操作可能无法执行。'

如何更正我的关闭事件,以便我可以要求用户确认并关闭窗口以及从任务管理器中干净地退出应用程序?

我的基本表单

public class BaseForm : Telerik.WinControls.UI.RadForm
    {
        public BaseForm()
        {
           this.FormClosing += new FormClosingEventHandler(Form_Closing);
        }
        public void Form_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        RadMessageBox.SetThemeName("Material");
        DialogResult dialogResult = RadMessageBox.Show(
                 this,
                 "Are you sure, you want to exit out of the application? Any unsaved data will be lost!",
                 "Application Name",
                 MessageBoxButtons.YesNo,
                 RadMessageIcon.Question,
                 MessageBoxDefaultButton.Button2,
                 RightToLeft.No);
        if (dialogResult == DialogResult.Yes)
        {
            e.Cancel = false;
            //Application.Exit();
        }
        else if (dialogResult == DialogResult.No)
        {
            e.Cancel = true;
        }
        base.OnClosing(e);
    }


     //....
     //....
     //....
    }

更新


如果我使用 FormClosed 事件,而不是 FormClosign 事件,Application.Exit() 可以正常工作,但如果我单击“否”,则在确认消息中它仍在关闭应用程序。

this.FormClosed += new FormClosedEventHandler(App_kill);

App Kill 方法(无法处理 DialogResult.No 响应)

private void App_kill(object sender, FormClosedEventArgs e)
        {

            if (e.CloseReason == CloseReason.UserClosing)
            {
                RadMessageBox.SetThemeName("Material");
                DialogResult dialogResult = RadMessageBox.Show(
                         this,
                         "Are you sure, you want to exit out of the application? Any unsaved data will be lost!",
                         "Close Application",
                         MessageBoxButtons.YesNo,
                         RadMessageIcon.Question,
                         MessageBoxDefaultButton.Button2,
                         RightToLeft.No);
                if (dialogResult == DialogResult.Yes)
                {
                    Application.Exit();
                }

                if (dialogResult == DialogResult.No)
                {
                    //e.Cancel = true;
                }
            }
        }

【问题讨论】:

  • 如果您注释掉RadMessageBox.ShowdialogResult 逻辑并然后尝试关闭应用程序会发生什么情况。它会杀死进程吗? (以防 Telerik 做一些奇怪的事情)
  • 我看到你的类被命名为BaseForm,你是从它派生一个代表你的应用程序窗口的子类吗?
  • @MickyD,是的,如果我删除 RadMessageBox.Show 它将很好地终止进程。是的,我所有的表单都是从 BaseForm 派生的
  • 如果在可能关闭窗口期间使用 Telerik 可能会出现错误。也许它附在它上面并进行一些笨拙的模态处理?您可以使用普通的 ol' WinForms MessageBox.Show,它可能看起来不那么漂亮,但它对 YesNo、Question 等具有相同的功能。我可能会针对 Telerik 提出错误报告
  • @MickyD MessageBox.Show 有同样的问题,这里的问题是这个事件被连接到 FormClosing 事件。当我们调用 Application.Exit() 它再次调用 FormClosing 事件时,我认为在 Application.Exit() 上我应该防止触发 FormClosing

标签: c# winforms telerik .net-4.7.2


【解决方案1】:

感谢nihique 在这里发布https://stackoverflow.com/a/13459878/942855 并且在这个问题 cmets 中也由MickyD 指出。

显然我的闭幕活动没有问题。当我从 Form-A 重定向到 Form-B 时,我必须进行以下接线,然后它就像一个魅力

 var newform = new myNewForm();
  newform.Closed += (s, args) => this.Close();
  this.Hide();
  newform.Show();

【讨论】:

  • 提及您有两种表格可能会很有用。很高兴你仍然可以顺利进行
猜你喜欢
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
相关资源
最近更新 更多