窗口关闭的提醒,关闭子窗口而不释放子窗口对象的题材解决

1 在主窗口中实例化子窗口

在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象。

Form2 f2 = new Form2();

窗口关闭的提醒,关闭子窗口而不释放子窗口对象的题材解决。在网上找来一些艺术,感觉还都毋庸置疑,下边给出情势:

自己将经过本文向大家介绍添加”窗口关闭的升迁”的恰到好处做法。

原文 C# Winform
拦截关闭按钮触发的事件

二 通过按钮来突显主窗口

在按钮中供给完结的是窗口的显示

private void Config_Click(object sender, EventArgs e)
        {
            f2.Show();
        }

在线扫描相机的调节进程中,需求开发调节和测试界面来开始展览岗位的布署。调节和测试完成后,一种常用的法子是将调节和测试参数保存并在下次运维时加载。另一种简易方法是直接接纳该参数运维程序。由此,在后一种景况下,须要贯彻的法力是:就算关闭调节和测试窗口,其窗口对象也不自由。除非其主窗口关闭,才销毁其调节窗口的对象。

在程序运行时,能够通过点击右上角的红叉,关闭2个窗体;也能够经过调用窗体的Close()方法关闭窗体。假使想在窗体关闭前向用户提供七个提醒框,幸免重大音信未被保留就倒闭,大家会如何做吗?很四人会想到在调用Close前到场音讯框代码。但以此做法是不完美的,因为Close方法是被调用的,你不晓得Close在会何处调用,而且你不容许随处都写消息框语句。正确的做法却不是调用Close在此之前,而是调用Close“之后”

用户关闭软件时,软件壹般会给“是不是确认关闭”的提示。

三 关闭子窗口而不释放子窗口对象的方法

经查询和实证,修改子窗口中Dispose(在子窗口设计器中寻找修改)的方法是可行的。更改如下:

protected override void Dispose(bool disposing)
        {
            Hide();
            //if (disposing && (components != null))
            //{
            //    components.Dispose();
            //}
            //base.Dispose(disposing);
        }

一 在主窗口中实例化子窗口

  在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象。

 Form2 f2 = new Form2();

毋庸置疑的做法是处理Form的FormClosing事件:

1般,大家把它写在FormClosing
事件中,假如鲜明关闭,就关门;不然把FormClosing伊夫ntArgs 的 Cancel
属性设置为 true,就收回了该窗体的闭馆。

四 在父窗口关闭时销毁子窗口对象

鉴于必要在父窗口关闭是销毁子窗口对象,由此,在父窗口的闭馆动作FormClosed中添加调用子窗口f贰的绝迹函数。

 private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            f2.Close();
        }  

子窗口类中加上的关门函数如下:

 public void Close()
        {

            this.Dispose();

        }

出处:


此外还有壹种方法:

子窗体定义三个信托,父窗体实例化子窗体时注册子窗体的委托事件(具体职能是兑现父窗口的控件变化),子窗体关闭时调用事件措施。

父窗体

public void ShowPopWindow()
        {
            TestA sub = new TestA();
            sub.CloseWindow += new Action(sub_CloseWindow);
            sub.show();
        }

        void sub_CloseWindow()
        {
            //改变父窗体控件内容
        }

子窗体

public class TestA
    {
        public event Action CloseWindow;

        protected virtual void OnCloseWindow()
        {
            Action handler = CloseWindow;
            if (handler != null) handler();
        }

      //子窗体关闭事件
        private void CloseSubWindow()
        {
            OnCloseWindow();
        }
    }

美高梅开户网址,出处:


依照地点的辨证,大家团结完毕团结的法力,我的机能实在很简单,就1行代码,释放能源,

Form2 fui = null;

private void button1_Click(object sender, EventArgs e)
        {
            if (fui == null)
                fui = new userUserInfo();
            fui.MdiParent = this;
            fui.FormClosed += delegate(object obj, FormClosedEventArgs arg) { fui = null; };
            fui.Show();
            fui.Activate();
        }

但要求专注,在 fui.FormClosed += delegate(object obj,
FormClosed伊芙ntArgs arg) { fui = null;
};中运用的参数,不要和按钮事件中参数名相同,注意参数冲突。

出处:

贰 通过按钮来显示主窗口

  在按钮中须求贯彻的是窗口的展现

private void Config_Click(object sender, EventArgs e)
        {
            f2.Show();
        }

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

比方该窗体是主窗体,我们想在该窗体关闭时关闭全体应用程序,会遇上至少二种情景:

三 关闭子窗口而不释放子窗口对象的办法

经查询和实证,修改子窗口中Dispose的方法是可行的。更改如下:

 protected override void Dispose(bool disposing)
        {
            Hide();
            //if (disposing && (components != null))
            //{
            //    components.Dispose();
            //}
            //base.Dispose(disposing);
        }

Form实例被调用Close()方法后,不是即时销毁窗体而是新建FormClosing伊芙ntArgs实例e,作为参数发出FormClosing,在事变被处理完后,再自小编批评e.Cancel是或不是等于true,假若是true窗口撤除销毁,要是为false继续销毁Form。由此我们得以透过拍卖FormClosing事件,在拍卖个中对e.Cancel举办赋值,就可直达窗体撤消关闭,所以怎么前边强调”之后”。例如,前边提起的能够这么完结代码:

(一)该窗体同时是开发银行窗体,即它是应用程序中有所窗体的父类,则整个应用程序会被关门。

4 在父窗口关闭时销毁子窗口对象

  由于必要在父窗口关闭是销毁子窗口对象,因而,在父窗口的关门动作FormClosed中添加调用子窗口f贰的绝迹函数。

 private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            f2.Close();
        }  

  子窗口类中加上的关门函数如下:

 public void Close()
        {

            this.Dispose();

        }

 

出处:

===================================================================================

除此以外还有1种方法:

子窗体定义一个寄托,父窗体实例化子窗体时注册子窗体的委托事件(具体效果是落成父窗口的控件变化),子窗体关闭时调用事件措施。

  

父窗体
public void ShowPopWindow()
        {
            TestA sub = new TestA();
            sub.CloseWindow += new Action(sub_CloseWindow);
            sub.show();
        }

        void sub_CloseWindow()
        {
            //改变父窗体控件内容
        }

子窗体
public class TestA
    {
        public event Action CloseWindow;

        protected virtual void OnCloseWindow()
        {
            Action handler = CloseWindow;
            if (handler != null) handler();
        }

      //子窗体关闭事件
        private void CloseSubWindow()
        {
            OnCloseWindow();
        }
    }

出处:

========================================================================

根据地方的辨证,大家自个儿达成团结的法力,我的机能实在很简短,就1行代码,释放财富,

Form2 fui = null;

private void button1_Click(object sender, EventArgs e)
        {
            if (fui == null)
                fui = new userUserInfo();
            fui.MdiParent = this;
            fui.FormClosed += delegate(object obj, FormClosedEventArgs arg) { fui = null; };
            fui.Show();
            fui.Activate();
        }

但必要专注,在 fui.FormClosed += delegate(object obj,
FormClosed伊芙ntArgs arg) { fui = null;
};中运用的参数,不要和按钮事件中参数名相同,注意参数冲突。

 

(二)倘使该窗体不是运转窗体,比如大家做了二个迎接窗体,则应用程序中具备窗体的父类正是其1欢迎窗体了。那时该窗体的闭馆并不会倒闭全体应用程序。大家须要再参与“Application.Exit()”那行代码来退出应用程序。但与此同时又有标题了,父窗体的关门又会给该窗体发送关闭事件,于是该事件又被调用一遍,确认对话框又会弹出首回。解决方法是用上边包车型客车代码:


this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);

注:做欢迎体界面能够在主窗体中,ShowDialog方法打开欢迎界面,而不是把欢迎界面作为运维窗体。上面包车型地铁艺术仅有理论意义。

 

        protected override void WndProc(ref Message m)
        {
            //Console.WriteLine(m.Msg);
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_CLOSE = 0xF060;
            if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
            {
                //捕捉关闭窗体消息 http://www.cnblogs.com/sosoft/
                //用户点击关闭窗体控制按钮   注释为最小化窗体   
                //this.WindowState = FormWindowState.Minimized;

                //窗体隐藏
                this.Hide();
                return;
            }
            base.WndProc(ref m);
        } 

void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (MessageBox.Show(
            “窗口关闭后,数据即将丢失!是或不是未来关门窗口”,
            “提示”, 
            MessageBoxButtons.OKCancel, 
            MessageBoxIcon.Question) != DialogResult.OK)
            {
                e.Cancel = true;
            }
}

 

但要注意,那种处理程序1般的话只有e.Cancel = true;的代码,未有e.Cancel =
false;的代码。因为事件是属于1种委托,委托是多播的。所以,有相当的大希望有八个事件处理代码段,假诺赋值将会潜移默化整个信托的参数。那里的供给是,一旦中间3个处理的代码段e.Cancel=true,窗体都不该被关门,所以应尽量制止e.Cancel=false
的赋值语句影响其余的事件处理结果。

C# 窗体关闭时能够接触的轩然大波

FormClosing :在窗体关闭时,FormClosing
事件发生。窗体关闭时,此事件会收获处理,从而释放与此窗体关联的具有能源。假如裁撤此事件,则该窗体保持开拓状态。若要撤消窗体的关闭操作,请将传递给事件处理程序的
FormClosing伊夫ntArgs 的 Cancel 属性设置为 true。

FormClosed:在用户或 Application 类的 Close 方法或 Exit
方法关闭窗体后,会生出 FormClosed 事件。若要制止窗体关闭,请处理
FormClosing 事件,并将传递给事件处理程序的 Cancel伊夫ntArgs 的 Cancel
属性设置为
true。能够运用此事件实施1些职责,如自由窗体使用的能源,还可应用此事件保存输入窗体中的音信或更新其父窗体。

当窗体展现为方式对话框时,单击“关闭”按钮(窗体右上角带 X
的按钮)会隐藏窗体并将 DialogResult 属性设置为
DialogResult.Cancel。通过在窗体的 FormClosing 事件的事件处理程序中装置
DialogResult 属性,能够在用户单击“关闭”按钮时重写分配给 DialogResult
属性的值。

注意
在展现为无形式窗口的 Form 上调用 Close 方法时,无法调用 Show
方法使窗体可知,因为窗体的能源已被释放。若要隐藏窗体然后又使其可知,请使用
Hide 方法。
 

设若窗体是多文书档案界面 (MDI) 父窗体,则在吸引 MDI 父窗体的 FormClosing
事件在此以前将抓住全数 MDI 子窗体的 FormClosing 事件。同样,在掀起 MDI
父窗体的 FormClosed 事件在此以前,将掀起全体 MDI 子窗体的 FormClosed
事件。撤废 MDI 子窗体的 FormClosing 事件不可能防止引发 MDI 父窗体的
FormClosing 事件。可是,打消该事件会将用作参数字传送递给父窗体的
FormClosing伊芙ntArgs 类的 Cancel 属性设置成 false。要强制关闭全体 MDI
父窗体和子窗体,请将 MDI 父窗体中的 Cancel 属性设置成 false。

上边三个简单易行例子:

private void Form2_FormClosing(object sender, FormClosingEventArgs e)  
{  
    DialogResult result = MessageBox.Show("你确定要关闭吗!", "提示信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);  
    if (result == DialogResult.OK)  
    {  
        e.Cancel = false;  //点击OK
    }  
    else 
    {  
        e.Cancel = true;  
    }  
}

 推荐二个C#操作SQL
Server数据库的实例:

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图