设置具有长数据源的组合框
Set combobox with long datasource
情况:如果访问数据库实际上非常快,超过0.3秒,但是在将数据源分配给组合时出现滞后,冻结超过1分钟。
问题:如何设置组合框、非常长的数据源(超过 100,000 个注册表)且不冻结表格。
实际代码:
var q = from c in DataContext.MyTable
select new { Name = c.Name, Id = c.Id };
IQueryable datasource = q;//q.Count()>100,000
this.comboBox1.DisplayMember = "Name";
this.comboBox1.ValueMember = "Id";
this.comboBox1.DataSource = datasource;
技术:
我正在使用 .Net Framework 4.5.51
使用 VS2013
已经尝试过:
A-使用BackgroundWorker 并在DoWork() 方法中设置数据源。
结果:什么都不做,组合没有元素。
B- 使用 BackGroundWorker 并在 RunWorkerCompleted() 方法中设置数据源。
结果:它确实有效但是就像在主线程中调用set一样,然后也冻结了表单。
C- 使用 BeginInvoke() 方法在不同的线程中设置数据源
结果:再次在主线程中完成工作并冻结应用程序
提前致谢。
也许您可以尝试从其父控件集合中删除组合框,填充组合框并将其添加回父级。类似的东西:
var parent = comboBox.Parent;
parent.Controls.Remove(comboBox);
comboBox.DataSource = ds;
parent.Controls.Add(comboBox);
情况:如果访问数据库实际上非常快,超过0.3秒,但是在将数据源分配给组合时出现滞后,冻结超过1分钟。
问题:如何设置组合框、非常长的数据源(超过 100,000 个注册表)且不冻结表格。
实际代码:
var q = from c in DataContext.MyTable
select new { Name = c.Name, Id = c.Id };
IQueryable datasource = q;//q.Count()>100,000
this.comboBox1.DisplayMember = "Name";
this.comboBox1.ValueMember = "Id";
this.comboBox1.DataSource = datasource;
技术: 我正在使用 .Net Framework 4.5.51 使用 VS2013
已经尝试过:
A-使用BackgroundWorker 并在DoWork() 方法中设置数据源。 结果:什么都不做,组合没有元素。
B- 使用 BackGroundWorker 并在 RunWorkerCompleted() 方法中设置数据源。 结果:它确实有效但是就像在主线程中调用set一样,然后也冻结了表单。
C- 使用 BeginInvoke() 方法在不同的线程中设置数据源
结果:再次在主线程中完成工作并冻结应用程序
提前致谢。
也许您可以尝试从其父控件集合中删除组合框,填充组合框并将其添加回父级。类似的东西:
var parent = comboBox.Parent;
parent.Controls.Remove(comboBox);
comboBox.DataSource = ds;
parent.Controls.Add(comboBox);