C#中WinForm程序退出方法技巧总结

一、关闭窗体

在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.Environment.Exit(0); 等他们各自的方法不一样,下面我们就来详细介绍一下。

1.this.Close();   只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出;

2.Application.Exit();  强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出;

3.Application.ExitThread(); 强制中止调用线程上的所有消息,同样面临其它线程无法正确退出的问题;

4.System.Environment.Exit(0);   这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。

二、登录窗体与主窗体的关闭

有许多人在用做c# 做登录窗体时会遇到这样的问题,登录成功后当前登录Form关闭,打开Main窗体,但Main窗体点关闭按钮后程序仍在进程仍旧在运行。

事实上,关闭Main窗体,只是关闭了Main窗体的线程,并没有关闭程序的主线程,即程序的主线程为登录From。

方法一:(FrmLogin 为登录窗体,FrmMain 为主窗体) //登录窗体中“登录”按钮的单击事件

private void button1_Click(object sender, EventArgs e)
{
if (txtName.Text == "")
{
FrmMain fm = new FrmMain();
fm.Show();
this.Dispose(false);
}
}

//主窗体的FormClosing事件或FormClosed事件代码

private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)

{

Application.Exit();

}

//主窗体的FormClosed事件代码

private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)

{

Application.Exit();

}

说明:FormClosing事件或FormClosed事件二选一,这两个的区别在于 FormClosed 在关闭后发生,窗体的关闭动作不可取消;

FormClosing 在关闭前发生,可取消,只要在里面使用 e.Cancel=true; 就可以让窗口不能关闭。

进阶技巧:在退出程序前弹出确认退出程序的对话框 //主窗体的FormClosing事件代码

private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)

{

if (MessageBox.Show("真的要退出程序吗?", "退出程序", MessageBoxButtons.OKCancel) == DialogResult.Cancel)

{

e.Cancel = true;

}

}

////主窗体的FormClosed事件代码

private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)

{

Dispose();

Application.Exit();

}

小贴士:以下代码会导致显示确定退出的两次对话框,第一次单击“确定”第二次单击任何一个都会退出。

private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)

{

if (MessageBox.Show("真的要退出程序吗?", "退出程序", MessageBoxButtons.OKCancel) == DialogResult.OK)

{

Application.Exit();

}

else

{

e.Cancel = true;

}

}

分析:第一次单击了退出对话框的“确定”按钮后,Application.Exit();会导致触发第二次FrmMain_FormClosing()事件,所以就会显示两个确认退出的对话框,但第二对话框的选择对是否退出没有影响。可以改为判断如果单击了不是确认按钮则e.Cancel = true; ,确定按钮什么都不写或不做判断,如果要加上Application.Exit(); 可以将其添加到窗体的FormClosed事件中。  方法二:

//program.cs  程序入问的Main()方法代码,其中FrmLogin为登录窗体,FrmMain为主窗体

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

FrmLogin fl = new FrmLogin();

if (fl.ShowDialog() == DialogResult.OK)

{

Application.Run(new FrmMain());

}

}

//登录窗体中的“登录”按钮代码

private void button1_Click(object sender, EventArgs e)

{

if (txtName.Text == "123456")

{

this.DialogResult = DialogResult.OK;

this.Close();

}

}

C#中WinForm程序退出方法技巧总结的更多相关文章

  1. 【转】C#中WinForm程序退出方法技巧总结

    C#中WinForm程序退出方法技巧总结 一.关闭窗体 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.Ex ...

  2. C#中WinForm程序退出方法技巧总结(转)

    本文实例总结了C#中WinForm程序退出方法技巧.分享给大家供大家参考.具体分析如下: 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit ...

  3. C#中WinForm程序退出方法技巧总结[转]

      这篇文章主要介绍了C#中WinForm程序退出方法,实例总结了技巧退出WinForm程序窗口的各种常用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例总结了C#中WinForm程序退出方法技 ...

  4. 【C# 开发技巧】 C#中WinForm程序退出方法技巧总结

    C#中WinForm程序退出方法技巧总结 一.关闭窗体 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.Ex ...

  5. C#中Winform程序中如何实现多维表头【不通过第三方报表程序】

    问题:C#中Winform程序中如何实现多维表头. 在网上搜了很多方法,大多数方法对于我这种新手,看的都不是很懂.最后在新浪博客看到了一篇比较易懂的文章:[DataGridView二维表头与合并单元格 ...

  6. 在C#中winform程序中应用nlog日志工具

    在C#中winform程序中应用nlog日志工具,配置文件简单应用. 文件名 nlog.config,请注意修改属性为"始终复制",发布时候容易遇到不存在文件的错误提示. 通过Nu ...

  7. 制作移动端手机网站过程中的SEO优化方法技巧

    据国内三大运营商数据来看,中国的手机用户数已达10亿,超过2/5的移动用户每个月都会从手机终端访问网页,如今的移动端手机网站比例肯定有提升,但是对于这些存在的移动版本网站来说,马海祥查看了很大一部分手 ...

  8. c#winform程序退出的方法

    一共有4种方式: 1.this.Close();  只是关闭当前窗口,若不是主窗体,无法退出程序,另外若有托管线程(非主线程),也无法干净的退出: 2.Application.Exit();强制所有消 ...

  9. C# WinForm程序退出的方法(转)

    转自:http://www.cnblogs.com/yugen/archive/2010/08/10/1796864.html 1.this.Close();   只是关闭当前窗口,若不是主窗体的话, ...

随机推荐

  1. asp.net mvc输出自定义404等错误页面,非302跳转

      朋友问到一个问题,如何输出自定义错误页面,不使用302跳转.当前页面地址不能改变. 还要执行一些代码等,生成一些错误信息,方便用户提交反馈. 500错误,mvc框架已经有现成解决方法: filte ...

  2. js静态方法

    1.ajax() 方法是属于“函数”本身的,和返回的对象没有关系 2.bark药调用,必须药new Hashiqi()得到对象,且由返回对象才能调用 3.ajax()方法药调用,不需要new对象,直接 ...

  3. SQL中的delete和TRUNCATE的用法

    TRUNCATE TABLE 表名 删除表中的所有行,而不记录单个行删除操作. 语法 TRUNCATE TABLE name 参数 name 是要截断的表的名称或要删除其全部行的表的名称. 注释 TR ...

  4. CSS 设计彻底研究(五)文字与图像

    第五章 文字与图像 5.1.2 设置字体 通过font-family属性设置字体.可以声明多种字体,字体之间用逗号分隔开.如一些字体名称中间有空格,需用双引号将其引起来,使浏览器知道这是一种字体的名称 ...

  5. canvas写的一个小时钟demo

    <!DOCTYPE html> <html> <head> <title>HTML5 Canvas Demo of clock</title> ...

  6. javascript 高级程序设计学习笔记(面向对象的程序设计) 1

    Object构造函数或对象字面量都可以用来创建对象,但这些方式有个明显的缺点:使用相同一个接口创建很多对象,会产生大量重复代码. 工厂模式 //工厂模式 function createDog (nam ...

  7. 导入android项目在eclipse中会报@Override错误

    很多时候导入android项目在eclipse中会报@Override错误,这是由于java编译器的版本不正确,Java 1.5的编译器默认对父类的方法进行覆盖,采用@Override进行说明:但1. ...

  8. SAR ADC : 逐次逼近寄存器型(SAR)模数转换器(ADC)

    1.为实现二进制搜索算法,N位寄存器首先设置在中间刻度(即:100... .00,MSB设置为1).这样,DAC输出(VDAC)被设为VREF/2,VREF是提供给ADC的基准电压.然后,比较判断VI ...

  9. c++连接mysql数据库(使用mysql api方式,环境VS2013+MYSQL5.6)

    转载请注明出处,原文地址http://www.cnblogs.com/zenki-kong/p/4382657.html 刚开始写博客,博主还只是个大三汪,学艺不精,如有错误还请前辈指出(>^ω ...

  10. ElasticSearch入门知识扫盲

    ElasticSearch 入门介绍 tags: 第三方 lucene [toc] 1. what Elastic Search(ES)是什么 全文检索和lucene 全文检索 优点:高效,准确,分词 ...