【问题标题】:Windows Forms listbox is overflowing when there are too many items to scroll当要滚动的项目太多时,Windows 窗体列表框溢出
【发布时间】:2009-02-23 23:55:47
【问题描述】:

我正在构建一个基于后缀树的索引器应用程序,它使我能够以极快的速度索引整个文档并搜索字符串、子字符串等。

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

通常,这可以正常工作。例如,搜索“wizard”或“Gandalf”或“hobbit”(我将 FOTR 作为测试:D)工作得很好而且很花哨。不过,我现在正在尝试使用字母 e。

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

我知道滚动88974个(基于listbox.Items.Count)项有点极端,但从逻辑上讲,没有理由会出现这样的问题。

感谢您阅读本文!

编辑:所有回答的人,感谢您的回答。我终于用列表视图实现了这个,它更快,并且可以很好地容纳许多项目。谢谢!

【问题讨论】:

    标签: c# .net winforms listbox


    【解决方案1】:

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

    【讨论】:

    • 看起来这个错误在 Windows 8.1 中仍然存在
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        实施 DataGridView 对于 SO 答案来说有点太长了,但这里有一个教程链接:

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

        【讨论】:

          猜你喜欢
          • 2021-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多