当要滚动的项目太多时,Windows窗体列表框会溢出

时间:2009-02-23 23:55:48

标签: c# .net winforms listbox

我正在构建一个基于后缀树的索引器应用程序,这使我能够非常快速地索引整个文档和搜索字符串,子字符串等。

我正在做的是在文本框中输入一个字符串,按下按钮,然后运行查询后缀树的函数,并将字符串的所有出现位置添加到列表框中。所以列表框里面有很多整数。

通常,这很好用。例如,搜索“向导”或“Gandalf”,或“hobbit”(我将FOTR索引为测试:D)工作正常且花花公子。但是,我现在用字母e来试试。

问题是字母e的位置确实列在列表框中。全部88974个。但是,当我通过拖动滚动按钮向下滚动时,当我在项目60000左右时,列表框似乎循环返回到顶部。由于我尝试向下滚动页面并且一切正常,所以问题变得更加棘手。

我知道滚动浏览88974(基于listbox.Items.Count)项目有点极端,但从逻辑上讲,没有理由存在这样的问题。

感谢您阅读此内容!

编辑:对所有回答的人,谢谢你的回答。我最终使用listview实现了它,并且速度更快,可以很好地保存很多项目。谢谢!

4 个答案:

答案 0 :(得分:6)

这是Vista特有的错误。当您滚动超过65536 +可见项目数时,它会变得疯狂。这个bug在SP1中没有得到修复。在XP中没有问题。但是,是的,这是一个很少进行测试的错误。

答案 1 :(得分:4)

可能ListBox仍然使用16位范围/位置消息进行滚动条。如果它是底层控件的问题,您可以尝试在Win32中重现它。

您可能想要尝试列表视图控件而不是列表框。我希望它不会遇到这种限制,它的虚拟模式也应该更高效。

答案 2 :(得分:1)

听起来你在16位(2 ^ 16 = 65536)点附近遇到了一个奇怪的现象。我的猜测是,控件的滚动逻辑中存在一个错误,导致该点周围出现打嗝。我想他们认为没有人会在列表框中放置超过65000个项目:)

答案 3 :(得分:1)

正如其他人所说,您可能会遇到可以存储在ListBox中的最大项目数的限制。你可能最好切换到在虚拟模式下使用DataGridView的那么多项。

对于SO答案,实现DataGridView有点太长了,但是这里是指向教程的链接:

http://msdn.microsoft.com/en-us/library/2b177d6d.aspx