【问题标题】:How do I show a MessageBox prompt when the user has clicked the cross in the title bar当用户单击标题栏中的叉号时,如何显示 MessageBox 提示
【发布时间】:2011-10-31 14:40:51
【问题描述】:

我目前正在开发一个 C# Windows 窗体应用程序。

用户通过loginForm登录后,会被带到mainForm。

我想以这样一种方式对其进行编码,当用户单击 mainForm 中标题栏上的叉号后,会提示用户“这将关闭应用程序。确认?” 后跟一个是和否按钮。

如果是,将显示另一个框,“应用程序已关闭!”

如果否,消息框将关闭,应用程序将继续运行。

我当前的代码是:

private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
    {
        MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
        System.Windows.Forms.Application.Exit();
    }
    else
    {
        this.Activate();
    }   
}

但它不起作用。

首先我不知道为什么消息框会弹出两次以关闭整个事件。

其次,如果我单击“否”,表单也会关闭,我无法将其恢复。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    要取消关闭表单,在 else 语句中需要e.Cancel = true;。 在您的真实情况下,您不需要显式退出。

    试试这个

    private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
    
        }
        else
        {
            e.Cancel = true;
            this.Activate();
        }   
    }
    

    如果仅出于测试目的,我假设您的第二个 MessageBox 说它已关闭。

    你可能只想要。

    private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) != DialogResult.Yes)
        {
            e.Cancel = true;
        } 
    }
    

    请注意,该语句检查他们是否没有点击是,而不是他们是否点击取消。这意味着如果他们点击对话框上的 x,则不会被视为确认。

    编辑:如果 mainForm 不是主窗体

    好的,我想我知道你现在要问的了。

    我要做的是将上面第二个代码块中的代码放在 FormClosing 中,然后在 FormClosed 事件处理程序中包含这个

    private void mainForm_FormClosed(Object sender, FormClosedEventArgs e)
    {
        MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
        System.Windows.Forms.Application.Exit();
    }
    

    【讨论】:

    • 您好,感谢您的回复。它确实有效。但不完全是我想要的结果。我在 System.Windows.Forms.Application.Exit() 中编码的原因;是因为我希望整个应用程序结束。不仅仅是那种形式本身,因为它不是主要形式,而且我有多种形式。那我该怎么做呢?
    • 哦,mainForm不是主窗体吗?好的,那么只需将退出调用添加回真实案例。
    • 嗨,对不起。对此仍然很不确定。你这是什么意思?
    • 嗨,这也是我最初的问题的一部分。关键是当你这样做时,它会提示窗口两次而不是一次。因此,如果我要使用您输入的第一个代码框对其进行编码,您将单击 4 个窗口,是的,是的,是的。
    • @Thomas 好吧,我想我已经找到你了。你可以试试我上面更新的内容吗?我目前无法验证。
    【解决方案2】:

    这应该对你有帮助

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("Are you sure you want to close?", "Close", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
                e.Cancel = true;
        }
    

    【讨论】:

      【解决方案3】:

      要获得所需的功能,请尝试以下代码:

      private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
      {
          if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
          {
              MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
              //no need to do anything here.
          }
          else
          {
              e.Cancel = true;
          }   
      }
      

      【讨论】:

        【解决方案4】:

        您应该查看FormClosingEventArgs 中的 Cancel 属性: 这应该有效:

          private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
                } 
                else 
                {
                  e.Cancel = true; 
                }
            }
        

        http://msdn.microsoft.com/en-us/library/system.windows.forms.formclosingeventargs.aspx

        【讨论】:

        • 嗨,我很抱歉,但我没有明白你想说什么。我两次调用它的部分在哪里?
        • 您不需要在此处调用Exit(),因为无论如何应用程序都将处于关闭过程中。
        【解决方案5】:

        这将满足您的需求:

        private void mainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("This will close down the whole application. Confirm?", "Close Application", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                MessageBox.Show("The application has been closed successfully.", "Application Closed!", MessageBoxButtons.OK);
            }
            else
            {
                e.Cancel = true;
            }   
        }
        

        编辑:回答您的第一个问题,请参阅this。当您在应用程序中调用Exit() 时,会为所有打开的表单引发FormClosing 事件,包括mainForm(仍处于打开状态),因此该事件会引发两次。通常我希望这样的事情会导致无限递归和文字堆栈溢出,但我认为 .NET 足够聪明,可以防止这种情况发生。

        在相关说明中,您真的不应该通过调用 Exit() 来关闭您的程序 - 这是一种代码味道。

        【讨论】:

          【解决方案6】:
          var GetInput = MessageBox.Show("Do you want to Delete?", "Confirm Deletion",MessageBoxButton.OKCancel);
          
          if (GetInput == MessageBoxResult.OK)
          { 
             //do what you like
          }
          

          【讨论】:

            【解决方案7】:

            您的代码对我来说完美无误。

            private void exiteProToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if (MessageBox.Show("message", "title", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    Application.Exit();
                }
                else
                {
                    this.Activate();
                }   
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-11-13
              • 2022-10-24
              • 1970-01-01
              • 2012-02-16
              • 2011-10-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多