1

我在正在编写的 WinForm 应用程序中填充我的组合框时遇到问题。我用来填充这些组合框的数据是从数据库中提取的。问题是comboBoxes需要绑定的数据很多,所以这个过程需要很长的时间,整个应用程序被锁定(整个绑定数据的过程需要9秒多,而从数据库中提取数据仅需 400 毫秒)。我试图通过拆分创建控件(主线程)和填充组合框(后台工作者)的过程来加快速度,但我自然会得到跨线程错误。这是我使用的代码部分:

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 上的所有这些 DataTables( ),然后在创建它们时将它们传递给子窗体。这样我在应用程序加载时加载数据(它甚至不需要那么长时间),所以当我从子表单调用它时它应该可以使用。我试图Populate()backgroundWorker.DoWork()方法中调用该方法,但我得到了跨线程错误。

我的问题是 - 有没有办法让这项工作,如果没有,我可以用什么作为替代解决方案。

谢谢

4

2 回答 2

0

我不是一个完整的调用瓶,但试试这个:

PopulateData()
{
    if (combobox1.InvokeRequired)
    {
        combobox1.Invoke(new EventHandler(delegate(object o, EventArgs a)
            {
                PopulateData();
            }
                ));
    }
    else
    {
        // Do your updates here...
    }
}

我相信这会找到负责 combobox1 的线程,这将与其他组合的线程相同,然后运行。

我敢肯定,其他人可能会以更好的方式在表单级别调用?

于 2013-07-25T08:33:27.253 回答
-1

我找到了一个很好的替代方案,它把事情从 9 秒加快到了 1.5 秒。解决方案是将comboBox.DisplayMember“comboBox.DataSource”行放在“comboBox.DataSource”行之前,因为当您更改 DisplayMember(或 ValueMember)时,数据源会自行重新填充。因此,如果在comboBox.DisplayMember'comboBox.DataSource' 行之后,数据源会自行填充 2 次(我认为在绑定数据源时默认启用 ClearBeforeFill,这就是绑定数据中没有重复项的原因)。

不管怎么说,还是要谢谢你。

于 2013-07-25T09:33:01.250 回答