[转载]Winform等待窗口的实现(附源代码)
在开发Winform程序的时候,经常会用到等待窗口(如网络通讯、数据库连接等需要一定时间来执行的操作),这样可以给用户提供更好的体验。
等待窗口的主要功能是一边执行需要等待的操作,一边显示一个等待界面。当执行完毕时等待界面消失。用户可以提前取消操作,还可以设置操作的最大等待时间,若超过指定时间仍没完成操作可结束当前操作。等待窗口的操作处理内容可用λ表达式,在后面的应用实例中可看到使用方法。
实现界面如下图:
 
 
等待界面主要包含的部分:
- 等待图片;
- 等待消息文字("正在处理数据,请稍后..."):可自定义;
- 计时器:可设置不显示;
- 取消返回按钮:可设置不显示;
- 另外等待窗口显示和关闭的时候都有渐变的一个简单特效,等待窗口的颜色是在一定范围内随即的。
等待窗口实现代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 | usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespaceWinForm_Test{    publicpartialclassfrmWaitingBox : Form    {        #region Properties        privateint_MaxWaitTime;        privateint_WaitTime;        privatebool_CancelEnable;        privateIAsyncResult _AsyncResult;        privateEventHandler<EventArgs> _Method;        privatebool_IsShown = true;        privatereadonlyint_EffectCount = 10;        privatereadonlyint_EffectTime = 500;        /// <summary>        /// 控制界面显示的特性        /// </summary>        privateTimer _Timer;        publicstringMessage { get; privateset; }        publicintTimeSpan { get; set; }        publicboolFormEffectEnable { get; set; }        #endregion        #region frmWaitingBox        publicfrmWaitingBox(EventHandler<EventArgs> method,intmaxWaitTime,stringwaitMessage,boolcancelEnable,booltimerVisable)        {            maxWaitTime *= 1000;            Initialize(method, maxWaitTime,waitMessage, cancelEnable, timerVisable);        }        publicfrmWaitingBox(EventHandler<EventArgs> method)        {            intmaxWaitTime=60*1000;            stringwaitMessage = "正在处理数据,请稍后...";            boolcancelEnable=true;            booltimerVisable=true;            Initialize(method, maxWaitTime,waitMessage, cancelEnable, timerVisable);        }        publicfrmWaitingBox(EventHandler<EventArgs> method, stringwaitMessage)        {            intmaxWaitTime = 60 * 1000;            boolcancelEnable = true;            booltimerVisable = true;            Initialize(method, maxWaitTime, waitMessage, cancelEnable, timerVisable);        }        publicfrmWaitingBox(EventHandler<EventArgs> method, boolcancelEnable, booltimerVisable)        {            intmaxWaitTime = 60*1000;            stringwaitMessage = "正在处理数据,请稍后...";            Initialize(method, maxWaitTime,waitMessage, cancelEnable, timerVisable);        }        #endregion        #region Initialize        privatevoidInitialize(EventHandler<EventArgs> method, intmaxWaitTime,stringwaitMessage,boolcancelEnable, booltimerVisable)        {            InitializeComponent();            //initialize form            this.FormBorderStyle = FormBorderStyle.None;            this.StartPosition = FormStartPosition.CenterParent;            this.ShowInTaskbar = false;            Color[] c = GetRandColor();            this.panel1.BackColor = c[0];            this.BackColor = c[1];            this.labMessage.Text = waitMessage;            _Timer = newTimer();            _Timer.Interval = _EffectTime/_EffectCount;            _Timer.Tick += _Timer_Tick;            this.Opacity = 0;            FormEffectEnable = true;            //para            TimeSpan = 500;            Message = string.Empty;            _CancelEnable = cancelEnable;            _MaxWaitTime = maxWaitTime;            _WaitTime = 0;            _Method = method;            this.pictureBoxCancel.Visible = _CancelEnable;            this.labTimer.Visible = timerVisable;            this.timer1.Interval = TimeSpan;            this.timer1.Start();        }        #endregion        #region Color        privateColor[] GetRandColor()        {            intrMax = 248;            intrMin = 204;            intgMax = 250;            intgMin = 215;            intbMax = 250;            intbMin = 240;            Random r = newRandom(DateTime.Now.Millisecond);            intr1 = r.Next(rMin, rMax);            intr2 = r1 + 5;            intg1 = r.Next(gMin, gMax);            intg2 = g1 + 5;            intb1 = r.Next(bMin, bMax);            intb2 = b1 + 5;            Color c1 = Color.FromArgb(r1, g1, b1);            Color c2 = Color.FromArgb(r2, g2, b2);            Color[] c = { c1, c2 };            returnc;        }        #endregion        #region Events        privatevoidbtnCancel_Click(objectsender, EventArgs e)        {            this.Message = "您结束了当前操作!";            this.Close();        }        privatevoidtimer1_Tick(objectsender, EventArgs e)        {            _WaitTime += TimeSpan;            this.labTimer.Text = string.Format("{0}秒", _WaitTime / 1000);            if(!this._AsyncResult.IsCompleted)            {                if(_WaitTime > _MaxWaitTime)                {                    Message = string.Format("处理数据超时{0}秒,结束当前操作!", _MaxWaitTime / 1000);                    this.Close();                }            }            else            {                this.Message = string.Empty;                this.Close();            }                    }        privatevoidfrmWaitingBox_Shown(objectsender, EventArgs e)        {            _AsyncResult = _Method.BeginInvoke(null, null, null, null);            //Effect            if(FormEffectEnable)            {                _Timer.Start();            }            else                this.Opacity = 1;        }        privatevoidfrmWaitingBox_FormClosing(objectsender, FormClosingEventArgs e)        {            if(FormEffectEnable)            {                if(this.Opacity>=1)                    e.Cancel = true;                _Timer.Start();            }        }        privatevoid_Timer_Tick(objectsender, EventArgs e)        {            if(_IsShown)            {                if(this.Opacity >= 1)                {                    _Timer.Stop();                    _IsShown = false;                }                this.Opacity += 1.00 / _EffectCount;            }            else            {                if(this.Opacity <= 0)                {                    _Timer.Stop();                    _IsShown = true;                    this.Close();                }                this.Opacity -= 1.00 / _EffectCount;            }        }        #endregion            }} | 
应用实例代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 | stringres; DataTable dt=null; frmWaitingBox f = newfrmWaitingBox((obj,args)=>     {         Thread.Sleep(5000);         stringsql = "SELECT * FROM [test].[dbo].[studentInfo]";         SQLHelper sqlHelper=newSQLHelper();         dt = sqlHelper.ExecuteSqlStr(sql,outres);     }); f.ShowDialog(this); dataGridView1.DataSource = dt; | 
源码下载:下载地址——(http://files.cnblogs.com/anding/WinForm_Test1.rar)
原文地址:http://www.cnblogs.com/anding/archive/2010/10/07/1845251.html
[转载]Winform等待窗口的实现(附源代码)的更多相关文章
- [C#] (原创)进度等待窗口(附:自定义控件的使用)
		一.前言 技术没有先进与落后,只有合适与不合适. 在程序当中,经常有耗时较长的操作,为了给用户更好的体验,就需要给用户一个及时的反馈,这种时候就需要用到进度等待窗口. 实现进度等待窗口的技术有很多,比 ... 
- 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转
		效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载]) 本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较 ... 
- ASP.NET制作一个简单的等待窗口
		前一阵做一个项目,在处理报表的时候时间偏长,客户提出要做出一个等待窗口提示用户等待(页面太久没反映,用户还以为死了呢).在分析这一需求之后,觉得如果要实现像winform应用中的processbar太 ... 
- 【转】P2P之UDP穿透NAT的原理与实现(附源代码)
		作者:shootingstars (有容乃大,无欲则刚) 日期:2004-5-25 出处:P2P中国(PPcn.net) P2P 之 UDP穿透NAT的原理与实现(附源代码)原创:shootings ... 
- WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]
		原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过ServiceMetadataBehavior实现了基于WS-ME ... 
- Java设计模式-代理模式之动态代理(附源代码分析)
		Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ... 
- c# winform进入窗口后在文本框里的默认焦点
		c# winform 设置winform进入窗口后在文本框里的默认焦点 进入窗口后默认聚焦到某个文本框,两种方法: ①设置tabindex 把该文本框属性里的tabIndex设为0,焦点就默认在这 ... 
- c# winform 设置winform进入窗口后在文本框里的默认焦点
		c# winform 设置winform进入窗口后在文本框里的默认焦点 进入窗口后默认聚焦到某个文本框,两种方法: ①设置tabindex 把该文本框属性里的tabIndex设为0,焦点就默认在这个文 ... 
- 仿36氪(iOS版附源代码)
		前言: 这是我2016年3月开始写的,利用课余时间全心投入的项目,本以为是凭着轻松愉悦的方式来学习的,中途遇到bug解决bug的时候,每天晚上几乎都是写到寝室关灯,还有一次使用Github不当写了五天 ... 
随机推荐
- 关于SpringMVC和Struts2的区别
			1. 与struts2不同 1. springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器. 2. springmvc是基于方法开发,传递参数是通 ... 
- synopsys license maker
			参见bingled大牛的文章(http://bbs.eetop.cn/viewthread.php?tid=366602&extra=&page=1) 注意:经坛友提示,部分系统版本2 ... 
- nopCommerce的配置以及汉化
			这里给大家一些链接,是关于nopCommerce的一些介绍: nopCommerce的源代码 关于nopcommerce Nopcommerce中文资源 第一步 配置nopCommerce 先上一张 ... 
- redhat6.5 配置使用centos的yum源
			新安装了redhat6.5安装后,登录系统,使用yum update 更新系统.提示: This system is not registered to Red Hat Subscription Ma ... 
- .net远程连接oracle数据库不用安装oracle客户端
			asp.net远程连接oracle数据库不用安装oracle客户端的方法下面是asp.net连接远程Oracle数据库服务器步骤: 1.asp.net连接oracle服务器需要添加Sytem.Data ... 
- 【html】【10】div布局[div水平垂直居中]
			必看参考: http://www.jb51.net/css/28259.html 让div居中对齐缩写形式为: .style{margin:0 auto;} 数字0 表示上下边距是0.可以按照需要设置 ... 
- SSH连接时出现「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」解决办法
			用ssh來操控github,沒想到連線時,出現「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」,後面還有一大串英文,這時當然要向Google大神求助 ... 
- About 'atoi'
			在很多地方我们看到的都是:atoi 是一个 C Reference function atoi() convert a string to an integer. This function of s ... 
- Redis与Memcached的比较
			网络IO模型 Memcached 是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, ... 
- Nginx+keepalived实现负载均衡
			Nginx的优点是: 1.工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名.目录结构,它的正则规则比HAProxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx ... 
