C#方法执行时用模式窗口来显示进度条 .

在做项目的时候,会遇到执行某些方法系统停顿了一下,需要客户等待,在客户等待过程中,为了系统有更好的体验,应该加个等待的标志。

这时候加个进度条以提示用户系统正在执行着。下面这个例子,是通过一个模式窗口来实现进度条的显示。

先上图(这是一个发送邮件的方法):


下面介绍一下具体方法:

首先创建一个窗体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;
        }

 到这里就基本完成了……

 

posted on 2012-04-28 13:54  IT小小小鸟  阅读(5285)  评论(3编辑  收藏  举报