这是一个多线程更新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