簡體   English   中英

在C#中從backgroundWorker設置ComboBox DataSource

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM