我們知道,微軟的.NET控件做了大量的工作,用起來還是不錯的,一般的數據綁定或者賦值比較簡單。如下所示

文本賦值: txtTest.Text = "abc";

控件禁用: txtTest.Enable = false;

複雜的控件,如DataGridView的數據綁定,也是比較簡單,只要數據源支持IListDataSource接口就可以了,如下所示

dataGridView1.DataSource=list;//list為DataTable或者ArrayList或者List<T>等

在一般的單線程程序中,我們的數據綁定和UI的線程是一起的,那麼綁定很正常,很OK,但是在多線程裏面,如果你需要綁定這些數據,那麼就要費一點周章了,呵呵。

如果你在不同於UI的另外一個線程裏處理數據,當處理完畢,想綁定數據,那麼應該如何呢,下面介紹幾個方法給大家,一起分享一下,多線程控件中的數據綁定或者賦值等操作。

先介紹一個文本屬性的操作:



this
  .Invoke(
  new
   MethodInvoker(
  delegate
  ()
{
    
  this
  .Text 
  =
   message;
}));



 



this
  .Invoke(
  new
   MethodInvoker(
  delegate
  ()
{
    
  this
  .Enable
  =
   
  false
  ;
}));



 

其他的控件也一樣了,這樣就可以搞定多線程的屬性操作了,這種方法機會可以用於各種控件的操作,如DataGridView的數據綁定操作代碼如下



dataGridView1.Invoke(
  new
   MethodInvoker(
  delegate
  ()
 {
       dataGridView1.DataSource 
  =
   list;
 }));



 

這樣,但我們在多線程中使用的時候,如下面的操作中,就可以用這種跨線程的數據綁定了



private
   
  void
   btnUpdate_Click(
  object
   sender, EventArgs e)
{
    WaitCallback async 
  =
   
  new
   WaitCallback(AddData);
    ThreadPool.QueueUserWorkItem(async, 
  ""
  );
}



  private
   
  void
   AddData(
  object
   state)
{
     dataGridView1.Invoke(
  new
   MethodInvoker(
  delegate
  ()
     {
           dataGridView1.DataSource 
  =
   list;
     }));
}



 

 另外,我為了方便,封裝了一般控件的跨線程訪問的公共類,操作控件的代碼可以變化為另外一種情況(和上面不同的方式)



CallCtrlWithThreadSafety.SetText(
  this
  , 
  "
  您要顯示的文本
  "
  , 
  this
  );


  //
  禁用按鈕
  

  CallCtrlWithThreadSafety.SetEnable(
  this
  .btnUpdate, 
  false
  , 
  this
  );