我們知道,微軟的.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
);