[英]Setting ComboBox DataSource from backgroundWorker in C#
我在編寫的WinForm應用程序中填充comboBoxes時遇到問題。 我用來填充這些comboBox的數據是從數據庫中提取的。 問題在於,有很多數據需要綁定到comboBoxes,因此此過程需要很長時間才能鎖定整個應用程序(綁定數據的整個過程需要9秒鍾以上,而從數據庫中提取數據僅需400毫秒)。 我試圖通過拆分創建控件(主線程)和填充comboBoxes(后台工作程序)的過程來加快處理速度,但是自然會遇到跨線程錯誤。 這是我使用的代碼部分:
private void Populate()
{
comboBox1.BindingContext = new System.Windows.Forms.BindingContext();
comboBox1.DataSource = MyClass.dtMyDataTable;
comboBox1.DisplayMember = "TitleColumn";
.//I repeat the same code for each comboBox
.//I use the BiningContext because some of the comboBoxes have to display the
.//same data.
}
我創建了一個包含該表單所需的所有DataTables的類-有多種使用數據庫中相同數據的表單,因此我創建了一個類並創建了一個對象,該對象填充了父Form.Load( ),然后在創建它們時將它們傳遞給子窗體。 通過這種方式,我可以在應用程序加載時加載數據(它甚至不需要花費那么長的時間),因此當我從子窗體中調用它時應該可以使用它。 我試圖從backgroundWorker.DoWork()
方法調用Populate()
方法,然后出現跨線程錯誤。
我的問題是-有沒有辦法使這項工作奏效,如果沒有,我可以使用什么作為替代解決方案。
謝謝
我在調用時還不夠用,但是請嘗試以下操作:
PopulateData()
{
if (combobox1.InvokeRequired)
{
combobox1.Invoke(new EventHandler(delegate(object o, EventArgs a)
{
PopulateData();
}
));
}
else
{
// Do your updates here...
}
}
我相信這將找到負責combobox1的線程,該線程將與其他combobox1的線程相同,然后運行。
我確定其他人會以一種更好的方式(可能在表單級別)進行調用嗎?
我找到了一個不錯的選擇,它將速度從9秒提高到1.5秒。 解決方案是將comboBox.DisplayMember
放在'comboBox.DataSource'行之前,因為更改DisplayMember(或ValueMember)時,數據源會重新填充。 因此,如果comboBox.DisplayMember
位於'comboBox.DataSource'行之后,則數據源將自身填充2次(我認為綁定數據源時默認情況下會啟用ClearBeforeFill,這就是為什么綁定數據中沒有重復項的原因)。
不管怎么說,還是要謝謝你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.