在开发Winform程序的时候,经常会用到等待窗口(如网络通讯、数据库连接等需要一定时间来执行的操作),这样可以给用户提供更好的体验。
等待窗口的主要功能是一边执行需要等待的操作,一边显示一个等待界面。当执行完毕时等待界面消失。用户可以提前取消操作,还可以设置操作的最大等待时间,若超过指定时间仍没完成操作可结束当前操作。等待窗口的操作处理内容可用λ表达式,在后面的应用实例中可看到使用方法。
实现界面如下图:
等待界面主要包含的部分:
- 等待图片;
- 等待消息文字("正在处理数据,请稍后..."):可自定义;
- 计时器:可设置不显示;
- 取消返回按钮:可设置不显示;
- 另外等待窗口显示和关闭的时候都有渐变的一个简单特效,等待窗口的颜色是在一定范围内随即的。
等待窗口实现代码:
002 | using System.Collections.Generic; |
003 | using System.ComponentModel; |
008 | using System.Windows.Forms; |
010 | namespace WinForm_Test |
012 | public partial class frmWaitingBox : Form |
015 | private int _MaxWaitTime; |
016 | private int _WaitTime; |
017 | private bool _CancelEnable; |
018 | private IAsyncResult _AsyncResult; |
019 | private EventHandler<EventArgs> _Method; |
020 | private bool _IsShown = true ; |
021 | private readonly int _EffectCount = 10; |
022 | private readonly int _EffectTime = 500; |
026 | private Timer _Timer; |
027 | public string Message { get ; private set ; } |
028 | public int TimeSpan { get ; set ; } |
029 | public bool FormEffectEnable { get ; set ; } |
032 | #region frmWaitingBox |
033 | public frmWaitingBox(EventHandler<EventArgs> method, int maxWaitTime, string waitMessage, bool cancelEnable, bool timerVisable) |
036 | Initialize(method, maxWaitTime,waitMessage, cancelEnable, timerVisable); |
038 | public frmWaitingBox(EventHandler<EventArgs> method) |
040 | int maxWaitTime=60*1000; |
041 | string waitMessage = "正在处理数据,请稍后..." ; |
042 | bool cancelEnable= true ; |
043 | bool timerVisable= true ; |
044 | Initialize(method, maxWaitTime,waitMessage, cancelEnable, timerVisable); |
046 | public frmWaitingBox(EventHandler<EventArgs> method, string waitMessage) |
048 | int maxWaitTime = 60 * 1000; |
049 | bool cancelEnable = true ; |
050 | bool timerVisable = true ; |
051 | Initialize(method, maxWaitTime, waitMessage, cancelEnable, timerVisable); |
053 | public frmWaitingBox(EventHandler<EventArgs> method, bool cancelEnable, bool timerVisable) |
055 | int maxWaitTime = 60*1000; |
056 | string waitMessage = "正在处理数据,请稍后..." ; |
057 | Initialize(method, maxWaitTime,waitMessage, cancelEnable, timerVisable); |
062 | private void Initialize(EventHandler<EventArgs> method, int maxWaitTime, string waitMessage, bool cancelEnable, bool timerVisable) |
064 | InitializeComponent(); |
066 | this .FormBorderStyle = FormBorderStyle.None; |
067 | this .StartPosition = FormStartPosition.CenterParent; |
068 | this .ShowInTaskbar = false ; |
069 | Color[] c = GetRandColor(); |
070 | this .panel1.BackColor = c[0]; |
071 | this .BackColor = c[1]; |
072 | this .labMessage.Text = waitMessage; |
073 | _Timer = new Timer(); |
074 | _Timer.Interval = _EffectTime/_EffectCount; |
075 | _Timer.Tick += _Timer_Tick; |
077 | FormEffectEnable = true ; |
080 | Message = string .Empty; |
081 | _CancelEnable = cancelEnable; |
082 | _MaxWaitTime = maxWaitTime; |
085 | this .pictureBoxCancel.Visible = _CancelEnable; |
086 | this .labTimer.Visible = timerVisable; |
087 | this .timer1.Interval = TimeSpan; |
093 | private Color[] GetRandColor() |
101 | Random r = new Random(DateTime.Now.Millisecond); |
102 | int r1 = r.Next(rMin, rMax); |
104 | int g1 = r.Next(gMin, gMax); |
106 | int b1 = r.Next(bMin, bMax); |
108 | Color c1 = Color.FromArgb(r1, g1, b1); |
109 | Color c2 = Color.FromArgb(r2, g2, b2); |
110 | Color[] c = { c1, c2 }; |
116 | private void btnCancel_Click( object sender, EventArgs e) |
118 | this .Message = "您结束了当前操作!" ; |
122 | private void timer1_Tick( object sender, EventArgs e) |
124 | _WaitTime += TimeSpan; |
125 | this .labTimer.Text = string .Format( "{0}秒" , _WaitTime / 1000); |
126 | if (! this ._AsyncResult.IsCompleted) |
128 | if (_WaitTime > _MaxWaitTime) |
130 | Message = string .Format( "处理数据超时{0}秒,结束当前操作!" , _MaxWaitTime / 1000); |
136 | this .Message = string .Empty; |
142 | private void frmWaitingBox_Shown( object sender, EventArgs e) |
144 | _AsyncResult = _Method.BeginInvoke( null , null , null , null ); |
146 | if (FormEffectEnable) |
153 | private void frmWaitingBox_FormClosing( object sender, FormClosingEventArgs e) |
155 | if (FormEffectEnable) |
162 | private void _Timer_Tick( object sender, EventArgs e) |
166 | if ( this .Opacity >= 1) |
171 | this .Opacity += 1.00 / _EffectCount; |
175 | if ( this .Opacity <= 0) |
181 | this .Opacity -= 1.00 / _EffectCount; |
应用实例代码:
03 | frmWaitingBox f = new frmWaitingBox((obj,args)=> |
06 | string sql = "SELECT * FROM [test].[dbo].[studentInfo]" ; |
07 | SQLHelper sqlHelper= new SQLHelper(); |
08 | dt = sqlHelper.ExecuteSqlStr(sql, out res); |
12 | dataGridView1.DataSource = dt; |
源码下载:下载地址——(http://files.cnblogs.com/anding/WinForm_Test1.rar)