頻繁綁定DataGridView的DataSource卻不正常顯示


最近在寫一個多線程程序,需要跨線程訪問DataGridView,綁定其DataSource,而且由於線程幾乎是每隔幾秒都會重新綁定一次DataGridView的DataSource的,所以,遇到各種蛋疼的問題。

首先說一個最常見最容易想到的辦法:

首先在主線程設置System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;,隨后去Designer.cs文件中將DataGridView的聲明修改成public static 然后,在自定義的線程中直接使用datagridview1.DataSource =dt;然后結果是程序莫名的卡死。

上網一查,大家都說跨線程訪問控件時這么禁用跨線程調用檢查是不科學的,需要聲明一個委托來訪問,於是繼續折騰寫了如下代碼

 

[csharp]  view plain  copy
 
  1. public delegate void SetDGVSource(DataTable dt);  
  2.         public static void SetDGVSourceFunction(DataTable dt)  
  3.         {  
  4.   
  5.             if (dataGridView1.InvokeRequired)  
  6.             {  
  7.                 SetDGVSource delegateSetSource = new SetDGVSource(SetDGVSourceFunction);  
  8.                 dataGridView1.Invoke(delegateSetSource, new object[] { dt });  
  9.             }  
  10.             else  
  11.             {  
  12.                 dataGridView1.DataSource = dt;  
  13.                 dataGridView1.Columns[dataGridView1.Columns.Count - 1].Visible = false;//設置最后一列不可見  
  14.   
  15.             }  
  16.         }  


這樣確實可以訪問了,當時,發現當程序運行了分吧鍾的樣子,問題又莫名其妙的來了:莫名的崩潰。

 

后來繼續查資料,在論壇看到有人說需要添加什么綁定,發現不靠譜(WinForm程序不需要,那是ASP.NET的),繼續查閱,有人說需要將DataGridView的一個屬性改一下,

 

[csharp]  view plain  copy
 
  1. dataGridView1.AutoGenerateColumns = true;  


然后我就老老實實的添加了,然后出現的問題更加奇葩

 

屏幕上的datagridview依然是一片空白,貌似根本沒有添加上,正當喪氣之時,猛然間發現鼠標經過datagridview的空白區時,鼠標由指針變成了手型,這不是說明datagridview里面有東西么!!!!!果然,將鼠標在datagridview里面胡亂點擊拖動,就看到datagridview的一行行就這么被我一拖,它就顯示出來了,我拖動一行就顯示一行。。。。

蛋疼無比啊!!!!

不過在進一步的Debug中,我發現,如果不是頻繁的刷新datagridview的DataSource的話,目測他又是正常的。。。

后來繼續慢慢摸索,發現,在不改變設置DataSource的綁定頻率的情況下,如果改用手動綁定DataSource,他又神奇般的好了。。。。

代碼如下:

 

[javascript]  view plain  copy
 
  1. datagridview1.Rows.Clear();    
  2. foreach (DataRow dr in dt.Rows)    
  3. {    
  4.     datagridview1.Rows.Add(dr["姓名"], dr["年齡"]);    
  5. }   


就這樣居然就可以解決我的問題了!真是喜極而泣。。。

 

也許是datagridview里面的DataSource直接綁定有什么機制導致了它不能夠頻繁的更新吧。只能采用手動方式。當然了,類似於上面的方法,還可以使用下面的更加簡潔的代碼

 

[csharp]  view plain  copy
 
  1. datagridview1.DataSource =dt.Copy();  


最終我的代碼如下:

 

 

[csharp]  view plain  copy
 
  1. public static void SetDGVSourceFunction(DataTable dt)  
  2.         {  
  3.   
  4.             if (dataGridView1.InvokeRequired)  
  5.             {  
  6.                 SetDGVSource delegateSetSource = new SetDGVSource(SetDGVSourceFunction);  
  7.                 dataGridView1.Invoke(delegateSetSource, new object[] { dt });  
  8.             }  
  9.             else  
  10.             {  
  11.                 dataGridView1.DataSource = dt.Copy();  
  12.                 //dataGridView1.Rows.Clear();  
  13.                 //foreach(DataRow dr in dt.Rows)  
  14.                 //  dataGridView.Rows.Add(dr["姓名"],dr["年齡"]);  
  15.                 dataGridView1.AutoGenerateColumns = true;  
  16.                 dataGridView1.Columns[dataGridView1.Columns.Count - 1].Visible = false;//設置最后一列不可見  
  17.   
  18.             }  
  19.         }  

 

然后再在其他文件的其他的線程中只需要調用這個函數即可,便可成功的頻繁的綁定datagridview的DataSource!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM