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