威尼斯人线上娱乐

中关闭子窗口而不释放子窗口对象的法子,窗口关闭的唤醒

9 4月 , 2019  

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

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

Form2 f2 = new Form2();

在网上找来壹些方法,感觉还都毋庸置疑,上面给出格局:

本人将经过本文向我们介绍添加”窗口关闭的提醒”的贴切做法。

原文 C# Winform
拦截关闭按钮触发的轩然大波

2 通过按钮来展现主窗口

在按钮中必要完成的是窗口的体现

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

在线扫描相机的调剂过程中,供给开辟调试界面来展开岗位的布局。调节和测试完成后,壹种常用的不2诀假诺将调节和测试参数保存并在下次运维时加载。另一种简易方法是直接行使该参数运转程序。由此,在后1种处境下,需求贯彻的功用是:即便关闭调试窗口,其窗口对象也不自由。除非其主窗口关闭,才销毁其调节窗口的靶子。

在程序运转时,能够经过点击右上角的红叉,关闭贰个窗体;也能够透过调用窗体的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事件:

壹般说来,大家把它写在FormClosing
事件中,倘诺明确关闭,就倒闭;不然把FormClosing伊芙ntArgs 的 Cancel
属性设置为 true,就收回了该窗体的关闭。

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

是因为须求在父窗口关闭是销毁子窗口对象,因而,在父窗口的倒闭动作FormClosed中添加调用子窗口f二的绝迹函数。

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

子窗口类中增加的倒闭函数如下:

 public void Close()
        {

            this.Dispose();

        }

出处:


除此以外还有壹种艺术:

中关闭子窗口而不释放子窗口对象的法子,窗口关闭的唤醒。子窗体定义2个寄托,父窗体实例化子窗体时注册子窗体的信托事件(具体效果是促成父窗口的控件变化),子窗体关闭时调用事件措施。

父窗体

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();
        }
    }

出处:


据说地点的印证,大家友好达成和谐的效益,小编的效益实在很简短,就一行代码,释放财富,

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()方法后,不是当时销毁窗体而是新建FormClosingEventArgs实例e,作为参数发出FormClosing,在事件被拍卖完后,再检查e.Cancel是还是不是等于true,若是是true窗口撤废销毁,倘若为false继续销毁Form。因而我们得以由此处理FormClosing事件,在处理个中对e.Cancel举办赋值,就可达到窗体撤废关闭,所以怎么后边强调”之后”。例如,前面提及的能够这么完结代码:

(一)该窗体同时是运行窗体,即它是应用程序中负有窗体的父类,则全体应用程序会被关闭。

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

  由于必要在父窗口关闭是销毁子窗口对象,因而,在父窗口的闭馆动作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();
        }
    }

出处:

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

基于下面包车型大巴验证,大家友好实现自个儿的效应,小编的效益实在很简短,就一行代码,释放能源,

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;
};中利用的参数,不要和按钮事件中参数名相同,注意参数龃龉。

 

(贰)借使该窗体不是开发银行窗体,比如我们做了三个欢迎窗体,则应用程序中具有窗体的父类正是以此欢迎窗体了。那时该窗体的倒闭并不会关闭全数应用程序。大家要求再参加“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;
            }
}

 

但要注意,那种处理程序一般的话唯有e.Cancel = true;的代码,未有e.Cancel =
false;的代码。因为事件是属于1种委托,委托是多播的。所以,有极大希望有五个事件处理代码段,借使赋值将会影响整个信托的参数。那里的急需是,一旦中间四个拍卖的代码段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 方法。
 

万1窗体是多文书档案界面 (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地图