Окно списка форм Windows Forms переполняется, когда слишком много элементов для прокрутки - PullRequest
3 голосов
/ 24 февраля 2009

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

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

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

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

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

Спасибо, что прочитали это далеко!

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

Ответы [ 4 ]

6 голосов
/ 24 февраля 2009

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

4 голосов
/ 24 февраля 2009

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

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

1 голос
/ 24 февраля 2009

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

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

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

1 голос
/ 24 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...