zoukankan      html  css  js  c++  java
  • 【转】WinForm的技巧(1 of n)窗口关闭的提示

    我将通过本文向大家介绍添加"窗口关闭的提示"的恰当做法。

    在程序运行时,可以通过点击右上角的红叉,关闭一个窗体;也可以通过调用窗体的Close()方法关闭窗体。如果想在窗体关闭前向用户提供一个提示框,防止重要信息未被保存就关闭,大家会怎么做呢?很多人会想到在调用Close前加入信息框代码。但这个做法是不完美的,因为Close方法是被调用的,你不知道Close在会何处调用,而且你不可能到处都写信息框语句。正确的做法却不是调用Close之前,而是调用Close"之后"

    正确的做法是处理Form的FormClosing事件:

    public delegate void FormClosingEventHandler(object sender, FormClosingEventArgs e);
    public event FormClosingEventHandler FormClosing;

    Form实例被调用Close()方法后,不是马上销毁窗体而是新建FormClosingEventArgs实例e,作为参数发出FormClosing,在事件被处理完后,再检查e.Cancel是否等于true,如果是true窗口撤销销毁,如果为false继续销毁Form。因此我们可以通过处理FormClosing事件,在处理当中对e.Cancel进行赋值,就可达到窗体撤销关闭,所以为什么前面强调"之后"。例如,前面说到的可以这样实现代码:


    this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);

     

    void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
    if (MessageBox.Show(
    "窗口关闭后,数据即将丢失!是否现在关闭窗口",
    "提示",
    MessageBoxButtons.OKCancel,
    MessageBoxIcon.Question) != DialogResult.OK)
    {
    e.Cancel = true;
    }
    }


     

    但要注意,这种处理程序一般来说只有e.Cancel = true;的代码,没有e.Cancel = false;的代码。因为事件是属于一种委托,委托是多播的。所以,有可能有多个事件处理代码段,如果赋值将会影响整个委托的参数。这里的需求是,一旦其中一个处理的代码段e.Cancel=true,窗体都不应该被关闭,所以应尽量避免e.Cancel=false 的赋值语句影响其它的事件处理结果。

  • 相关阅读:
    JS 中 new 操作符
    js清除浏览器缓存的几种方法
    一个自定义分享按钮
    解决windows下nginx中文文件名乱码
    sublime text 3 添加 javascript 代码片段 ( snippet )
    transition动画最简使用方式
    hammerjs jquery的选项使用方法,以给swipe设置threshold和velocity为例
    sublime text 3 的emmet 添加自定义 html 片段
    解决 placeholder 垂直不居中,偏上的问题
    Sublime Text 3 配置 sass
  • 原文地址:https://www.cnblogs.com/chusiping/p/2226267.html
Copyright © 2011-2022 走看看