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 閱讀(1338) 評論(0)  編輯  收藏 所屬分類: Windows

          主站蜘蛛池模板: 吴忠市| 乌鲁木齐县| 奇台县| 肥城市| 土默特左旗| 桓台县| 毕节市| 南和县| 遂昌县| 增城市| 碌曲县| 四子王旗| 仙居县| 新乡县| 饶平县| 凤翔县| 英吉沙县| 宜州市| 贵阳市| 蓝山县| 武陟县| 文水县| 吉木萨尔县| 乌兰县| 奉节县| 喀喇沁旗| 延寿县| 靖远县| 凤山县| 科技| 台前县| 饶阳县| 离岛区| 苍南县| 南丹县| 青铜峡市| 新化县| 广汉市| 杂多县| 苏州市| 安庆市|