在做項目的時候,會遇到執行某些方法系統停頓了一下,需要客戶等待,在客戶等待過程中,為了系統有更好的體驗,應該加個等待的標志。
這時候加個進度條以提示用戶系統正在執行着。下面這個例子,是通過一個模式窗口來實現進度條的顯示。
先上圖(這是一個發送郵件的方法):
下面介紹一下具體方法:
首先創建一個窗體ProcessBar,在里面加一個方法。用於進度條遞增、顯示
public partial class ProcessBar : Form { public ProcessBar() { InitializeComponent(); } /// <summary> /// 進度條方法 /// </summary> /// <param name="nValue">進度條遞增的值</param> /// <returns></returns> public bool Increase(int nValue) { if (nValue > 0) { if (this.progressBar1.Value + nValue < progressBar1.Maximum) { progressBar1.Value += nValue; return true; } else { progressBar1.Value = progressBar1.Maximum;//默認值為100 this.Close(); return false; } } return false; } /// <summary> /// 這個方法是用於關閉窗口(有時進度條會卡住) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { this.Close(); } }
第二步:在主窗口聲明顯示進度條窗體對象和一個委托:
//委托 private delegate bool IncreaseHandle(int nValue); //進度條窗口 private ProcessBar myProcessBar = null; //聲明委托對象 private IncreaseHandle myIncrease = null; //郵件批量發送 private void Button_SendAll_Click(object sender, EventArgs e) { //使用線程起動 Thread thdSub = new Thread(new ThreadStart(ThreadFun)); thdSub.Start(); } private void ThreadFun() { //線程中的一個委托 MethodInvoker mi = new MethodInvoker(ShowProcessBar); this.BeginInvoke(mi);//異步挨靠委托 //延時1秒顯示窗口 Thread.Sleep(1000); bool blnIncreased = false; object objReturn = null; //循環執行委托,直到返回值 do { Thread.Sleep(50); objReturn = this.Invoke(this.myIncrease, new object[] { 2 }); blnIncreased = (bool)objReturn; } while (blnIncreased); } private void ShowProcessBar() { myProcessBar = new ProcessBar(); // 初始化進度條委托 myIncrease = new IncreaseHandle(myProcessBar.Increase); myProcessBar.StartPosition = FormStartPosition.CenterScreen; myProcessBar.ShowDialog(); myProcessBar = null; }
到這里就基本完成了……