• 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 的赋值语句影响其它的事件处理结果。

  • 相关阅读:
    log输出到日志和控制台
    CRM--搜索功能
    CRM--对数据进行排序
    CRM-注意的小事情
    CRM--modelform之instance
    CRM--保留原搜索条件
    crm系统
    Django多个app情况下静态文件的配置
    测试
    题库
  • 原文地址:https://www.cnblogs.com/cgzwwy/p/1283444.html
Copyright © 2020-2023  润新知