private void frmAdmin_FormClosing(object sender, FormClosingEventArgs e)
        {            if (DialogResult.Yes == MessageBox.Show("是否退出?", "温馨提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
            {                Application.Exit();
                e.Cancel = false;            }
            else
            {
                e.Cancel = true;
            }
           
        }
对窗体的关闭叉的formclosing事件放入以上代码,退出询问时选择“否”则不关闭窗体,但是选“是”为什么不能马上关闭,而要回答两次呢?

解决方案 »

  1.   

    因为你的Application.Exit(); 这句话,产生了一个递归FormClosing这个事件是窗体还没关闭,正在关闭的时候发生,你在这儿执行Application.Exit,就会又发出来一次FormClosing事件你可以单步跟踪一下看看,去掉这句话就行了
      

  2.   

    怪不得有时候调用Application.Exit()会提示资源已释放类型的错误,原来是多来了一遍~~
      

  3.   

    不会不能结束呀,除非你的这个主窗体是自己new出来的,如果是自己new出来的,那是那个new他的?那个代码里是怎么处理的?
      

  4.   

    这个也许可以解决问题,不过解决办法很拙劣,不知道有没有更优雅的解决办法。private bool _closing = false;
    private void frmAdmin_FormClosing(object sender, FormClosingEventArgs e)
            {
                if(_closing)
                {
                    return;
                }
                if (DialogResult.Yes == MessageBox.Show("是否退出?", "温馨提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                {
                    
                    _closing = true;
                    Application.Exit();
                    e.Cancel = false;            }
                else
                {
                    e.Cancel = true;
                }
               
            }
      

  5.   

    调用Application.Exit(),后,会触发每个窗体的Form_Cloing事件,所以像你上面写的那样;
    1.当你选择“否”,执行
    e.cancel=true
    窗体不关闭。
    2.当你选择"是"时,再弹出一个Message框,实际情况是:不管理你第二次选什么("是"或"否"),应用程序都会关闭(当然窗体也是)
    过程是这样的: private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
             {             if (DialogResult.Yes == MessageBox.Show("是否退出?", "温馨提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                 {                //其它窗体关闭等资源释放
                     if (DialogResult.Yes == MessageBox.Show("是否退出?", "温馨提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                     {                     //其它窗体关闭等资源释放                     e.Cancel = false;                 }
                     else
                     {
                         e.Cancel = true;
                     }
                     e.Cancel = false;             }
                 else
                 {
                     e.Cancel = true;
                 }                      }以下是修改后的代码: private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
             {             if (e.CloseReason != CloseReason.ApplicationExitCall)//当是调用 Application.Exit(方法时,不执行if下面的代码,直接关闭)
                 {
                     if (DialogResult.Yes == MessageBox.Show("是否退出?", "温馨提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
                     {                     Application.Exit();                 }
                     else
                     {
                         e.Cancel = true;
                     }
                 }
             }
      

  6.   

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {            DialogResult dr = MessageBox.Show("是否关闭程序!", "系统提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dr == DialogResult.No)
                {
                    e.Cancel = true;
                }
            }
    这样就可以了啊
      

  7.   


    我还是觉得有问题,这个窗体上主窗体么?是项目属性里设置的启动窗体么?如果不是,那窗体关闭确实有可能不能结束进程,不过如果这样,应该在启动这个窗体的地方去exit吧,在窗体的关闭事件里结束好奇怪