weidagang2046的专栏

物格而后知致
随笔 - 8, 文章 - 409, 评论 - 101, 引用 - 0
数据加载中……

多线程更新主界面上的DataGrid

这是一个多线程更新DataGrid的例子。场景如下:目标是将DataGrid中的数据导入到数据库,由于DataGrid中的数据不是完全正确的,所以对于错误的数据要保留下来,让用户去改,改了之后再导,导了再改,改了再导直到全部导进数据库为止。

基本的思路是:主GUI上有一个DataGrid,然后新开一个线程进行导入。线程导入数据后,把收集到的错误数据一次性返给主线程,然后显示在原来这个DataGrid中,提供给用户更改并再次导入。

发起一个线程很容易,这里就不讲了,直接进入主题,如果更新主界面上的DataGrid。由于在 .Net中由线程A创建的 控件是不允许其他线程直接修改的。因此,其他线程需要委托线程A,把需要更新的数据给线程A,由他自己去更新。

看如何实现的:

  private delegate void ReBindDataGrid_Delegate(DataTable dt);

  private void ReBindDataGrid(DataTable dt)
  {
   this.dgList.DataSource = dt.DefaultView;
   this.dgList.Refresh();
  }

  private void import_ThreadCompleted(object sender, ThreadCompletedArgs e)
  {

   this.lblIntro.Text += "\n执行完成!";

   if(e.ErrorRows != null)
   {
    ReBindDataGrid_Delegate dt = new ReBindDataGrid_Delegate(ReBindDataGrid);
    this.Invoke(dt,new object[]{e.ErrorRows.Copy()});
   }
   else
   {
    this.pBar.Value = 0;
    this.rtxtInfo.Text += "..Over!";
  }
   this.dgList.Enabled = true;
}

关键在于在主线程声明一个委托:private delegate void ReBindDataGrid_Delegate(DataTable dt);然后在导入线程的完成事件中,利用这个委托,执行主线程中的方法:ReBindDataGrid,同时把参数传给他。

OK,这样就完成了。

关于兼讲委托,只一句话,委托就是在二个不能直接相互操作的对象之间,建立一个桥梁。例如二个线程之间。

from: http://www.wintle.cn/article.asp?id=127

posted on 2006-12-27 11:20 weidagang2046 阅读(1321) 评论(0)  编辑  收藏 所属分类: Windows


只有注册用户登录后才能发表评论。


网站导航: