Список Windows Forms переполняется, когда слишком много элементов для прокрутки

Я создаю приложение индексатора на основе дерева суффиксов, которое позволяет мне очень быстро индексировать целые документы и строки поиска, подстроки и т. Д.

Я ввожу строку в текстовое поле, нажимаю кнопку и запускаю функцию, которая запрашивает дерево суффиксов и добавляет позиции всех вхождений строки в список. Итак, в списке есть много целых чисел.

Обычно это нормально работает. Например, поиск «волшебник», или «Гэндальф», или «хоббит» (я индексирую FOTR в качестве теста: D) работает нормально и здорово. Однако сейчас пробую с буквой е.

Проблема в том, что позиции буквы e действительно перечислены в списке. Всего 88974 штук. Однако, когда я прокручиваю вниз, перетаскивая кнопку прокрутки, кажется, что список циклически возвращается наверх, когда я нахожусь около элемента 60000 или около того. Проблема усугубляется тем фактом, что я пробовал прокручивать страницу вниз, и все работает нормально.

Я знаю, что прокрутка 88974 (на основе listbox.Items.Count) элементов немного экстремальна, но логически нет причин, по которым должна быть такая проблема.

Спасибо, что дочитали до этого места!

РЕДАКТИРОВАТЬ: Всем, кто ответил, спасибо за ответ. Я, наконец, реализовал это с помощью списка, и он намного быстрее и может довольно хорошо удерживать многие элементы. Спасибо!

Ответов (4)

Решение

Вероятно, ListBox все еще использует 16-битные сообщения диапазона / положения для полос прокрутки. Вы можете попытаться воспроизвести его в Win32, если это проблема базового элемента управления.

Вы можете попробовать элемент управления представлением списка вместо окна списка. Я ожидал, что он не столкнется с этим ограничением, и его виртуальный режим также должен быть более эффективным.

Это специфическая ошибка Vista. Он сходит с ума, когда вы прокручиваете 65536 + количество видимых элементов. Ошибка не была исправлена ​​в SP1. В XP нет проблем. Но да, это ошибка, которую редко проверяют.

Похоже, вы попали в странность в районе 16-битной (2 ^ 16 = 65536) точки. Я предполагаю, что это ошибка в логике прокрутки для элемента управления, которая вызывает икоту в этой точке. Я полагаю, они считают, что никто бы не поместил более 65000 пунктов в список :)

Как говорили другие, кажется вероятным, что вы столкнулись с ограничением максимального количества элементов, которые могут быть сохранены в ListBox. Вероятно, вам лучше переключиться на использование DataGridView в виртуальном режиме с таким количеством элементов.

Реализация DataGridView слишком длинна для ответа SO, но вот ссылка на учебное пособие:

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