1

我想在实际表单之前显示一个对话框(消息框),如果用户选择否,应用程序应该完全关闭。我正在尝试使用下面的代码,但即使单击否,也会显示表单!

public Form1()
{
    InitializeComponent();

    if (MessageBox.Show("Contiue or not", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.None, MessageBoxDefaultButton.Button1) == DialogResult.No)
        Application.Exit();
}

我也尝试过this.Clsoe,但后来我对Application.Run()

问题是什么?知道这样做的最佳方法是什么吗?

4

4 回答 4

5

将其放入您的如何Program.cs(假设您要确定是否启动应用程序)

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        if (
            MessageBox.Show(
                "Contiue or not", "Question", 
                MessageBoxButtons.YesNo, 
                MessageBoxIcon.None, 
                MessageBoxDefaultButton.Button1) == DialogResult.Yes)
            Application.Run(new Form1());
    }
于 2012-05-15T13:10:54.627 回答
1

在 program.cs 中执行此操作,如下所示:

  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  if (MessageBox.Show("Contiue or not", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.None, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
    Application.Run(new Form1());
于 2012-05-15T13:12:16.700 回答
1

OnLoad在事件而不是构造函数中显示您的消息框,例如:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    if (MessageBox.Show("Contiue or not", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.None, MessageBoxDefaultButton.Button1) == DialogResult.No)
    {
        Application.Exit(); // or this.Close();
    }
}

Application.Exit()在构造函数中不起作用,因为还没有任何形式,所以没有消息泵可以停止。
也会this.Close()引发错误,因为它会导致Dispose()表单上的调用;在尝试显示表单后立即Application.Run,但它已被处理并引发异常。

于 2012-05-15T13:13:29.493 回答
1

不要在构造函数中做这样的事情。在创建对象之前,您应该知道是否要创建对象。如果您说要在实际表单之前显示 MessageBox,请在调用构造函数之前显示它,例如在调用Application.Run().

Application.Exit()尝试终止所有消息泵,但它们尚未启动,因为Application.Run()启动它们。
Application.Exit()关闭应用程序的所有窗口,但还没有,因为你Form1甚至还没有构建。
您试图在应用程序有机会开始运行之前退出应用程序(Run尚未调用)。
因此,在应用程序的唯一表单的构造函数中调用该方法没有多大意义。

于 2012-05-15T13:15:14.067 回答