WinForms,.NET 3.5
我有一个需要显示不断增加的项目列表的ComboBox - 有一个长时间运行的进程获取项目,我希望能够随着时间的推移向用户显示项目。
将DatSource属性设置为naive Array / List不起作用,因为ComboBox未注册后续添加。
现在我可以将DatSource设置为BindingList - 但似乎这变得非常慢。当我加油时,事情就好了;但是我每隔几秒钟就会添加一千件物品,这个价格只会挂起来。
我完全愿意相信这是直接绑定到BindingList的固有缺点,但希望能更好地了解正在发生的事情。关于DatSource,BindingList和BindingSource的MSDN文章讨论了像BindingContexts和CurrencyManagers这样的概念,但是没有帮助我理解特定的事件,重绘以及可能导致这种速度减慢的重击事件。
我怀疑BindingSource向ComboBox注册了一个item-add事件,然后进行了一系列Item-added,DropDown-checks和invalidation。但MSDN浏览和谷歌搜索没有帮助我回答这个问题。
有人能指出我正确的方向吗?
澄清
我知道设计问题以及解决此问题的方法。所以我并不是在寻找一个解决方案 - 但是我想想要了解正在发生的事情的更深层次的机制。
答案 0 :(得分:2)
默认控件不适用于此类操作,因为据我所知,所有条目都缓存在控件上。
您需要使用一个正确支持“虚拟”模式的控件,这意味着它只会从列表中加载当前显示的几个项目。
答案 1 :(得分:0)
您可以尝试在ComboBox.BeginUpdate()和ComboBox.EndUpdate()中包装添加操作,但为了获得很多帮助,您可能需要添加批量项目。另一个选择是不使用数据绑定,只使用ComboBox.Items集合。不是很花哨,但应该有所帮助。
答案 2 :(得分:0)
我也很难使用标准控件显示大量数据。
我会尽量记住在我将代码发布到我的代码后在这里发布链接,但为了解决这个问题,我将一个滚动条附加到面板并使用滚动的值来计算哪些数据应该是可见的在小组中。