Backgroundwork控件应用小计

      昨天在论坛里提出了这样的一个问题:在winform中如何实现状态栏中显示数据加载信息,加载完后在datagridview中显示?数据加载比较耗时,从4个数据库通过存储过程得到4个datatable(表结构都一样),然后对4个表的数据进行计算合成一个新的datatable,想在状态栏显示这个过程,加载完成后将这个datatable赋给一个datagridview,然后显示出来。大致思路是用到多线程 但不知道如何实现。

      发帖以后,应者寥寥,看来winform应用式微啊,不得已只好自己想办法了,在msdn里面看到了backgroundworker控件介绍以及应用实例,感觉这个控件就是在ui线程之外开了一个新的后台线程,这个线程独立于ui线程运行,实现所谓的异步,而且在异步工作期间的一系列事件间可以方便的进行参数传递、返回值获取等,最爽的是在事件方法中对UI上的控件操作不会导致UI线程假死且判断设置控件的InvokeRequired为true。

      针对上面的问题,可以将比较耗时的数据加载工作放到backgroundworker的DoWork事件中去做,在数据加载方法中可放入状态标签toolStripStatusLabel(设置其text属性就可以在ui状态栏显示数据加载状态),而数据加载完毕返回的datatable绑定到datagridview并显示可以放到RunWorkerCompleted事件中去做,在开始执行的RunWorkerAsync方法中传入参数可以在后续事件中e.Argument获取(处理结果可通过e.Result获取),backgroundworker还有其他事件如ProgressChanged(显示进度条是很有用)和WorkerReportsProgress(进度条相关)和线程取消操作e.Cancelled、CancelAsync方法也很重要,这里不再细说了。

     在界面从工具栏拖入backgroundworker控件并设置好DoWork、RunWorkerCompleted事件,cs文件中代码如下:

private void btnLeave_Click(object sender, EventArgs e)
        {
            if (CombLeave.SelectedItem.ToString() == "请选择月份")
            {
                MessageBox.Show("请选择月份");
                return;
            }
            else
            {
                IList args = new BindingList ();
                args.Add(CombLeave.SelectedItem.ToString());
                args.Add("leave");
                this.backgroundWorker1.RunWorkerAsync(args);//在buttton的click事件中调用RunWorkerAsync方法并设置好要传递的参数,开启后台线程
            }
        }

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            IList args = (IList )e.Argument;
            e.Result = BuildDataTable(args[0], args[1]); //来自于数据库的数据加载

        }

private DataTable BuildDataTable(string yearmonth,string exetype)

{

//数据加载代码...

}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                // There was an error during the operation.
                string msg = String.Format("An error occurred: {0}", e.Error.Message);
                MessageBox.Show(msg);
            }
            else
            {
                DataGVLeave.DataSource = (DataTable)e.Result;//数据加载完成得到datatable作为控件datagridview的数据源,可以看到datagridview不需要任何额外的设置,非常方便
                DisplayDataGv(DataGVLeave);//显示数据
            }

        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值