Listbox RemoveAt Метод, вызывающий AutoScroll - PullRequest
2 голосов
/ 10 ноября 2011

Nutshell: как отключить автоматическую прокрутку назад к вершине ListBox при вызове RemoveAt (0)?

Фон:
У меня есть простой список, который я собираю с регулярными интервалами данных.

В основном я использую это инструмент отчетности о состоянии.

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

Я хочу, чтобы самые новые результаты были внизу, а самые старые результаты были "вытолкнуты вверх". Поскольку размер этого списка через некоторое время становится достаточно большим, я ограничиваю его размером до 1000 элементов.

Когда в коробку попадает более 1000 предметов, я использую RemoveAt (0), пока не получу снова 1000 предметов.

Чтобы всегда отображать наиболее актуальную информацию, я прокручиваю список вниз до конца. Проблема в том, что всякий раз, когда я вызываю RemoveAt (0), окно автоматически прокручивается обратно до нового элемента 0. По сути, каждый раз, когда я добавляю элементы в «полный» список, эффект заключается в быстрой прокрутке вверх. 1000 предметов, затем отступите на 1000 предметов, создавая неуклюжий вид дисплея.

Как отключить автоматическую прокрутку назад к вершине ListBox при вызове RemoveAt (0)?

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Это произойдет только тогда, когда нет выбранного элемента. Или другими словами, ListBox.SelectedIndex = -1. Простой обходной путь - выбрать элемент. Как и последний.

0 голосов
/ 10 ноября 2011

Я не могу ответить на ваш вопрос. Даже если бы я знал технологию, у меня не было бы ответа, который бы отвечал вашим потребностям. Отчасти проблема заключается в том, что вы спрашиваете: «Помоги мне решить эту проблему так, как я пытаюсь ее решить», а не «здесь проблема бизнеса, какое решение лучше».

Мой совет: вернемся к основной проблеме, которая звучит как «Мне нужен способ обновления« списка »новыми событиями, сохраняя список до 1000 элементов или меньше». Исходя из этого, у вас есть решение ListBox, добавленное снизу и очищенное сверху как ваше решение. И я не уверен, как отключить прокрутку в вашем решении, но я не уверен, что это единственный способ решить бизнес-проблему.

Разбит, есть несколько вопросов для ответа:

  1. Как связать / обновить данные?
  2. Как удержать элемент управления от прокрутки до новой позиции при изменении количества связанных элементов?

Что касается связывания, то программное добавление является одним из вариантов, добавляете ли вы снизу и обрезать верх или добавлять сверху и обрезать низ. Другое - собрать данные и заново привязать. Я предположил бы, что есть другие.

Проблема с прокруткой - это не проблема прокрутки, а проблема «запомни, что я смотрю» или проблема «всегда отображать новейшие». Если всегда отображать новейшие, вам нужно найти способ убедиться, что вы в конце, когда что-то добавлено или удалено. Если пользователь может поменять позицию, вам нужно иметь возможность хранить, где он находится, и возвращаться в эту позицию. Вы добавили некоторую сложность, поскольку ваш список может содержать от 1 до 1000 элементов, поэтому позиция прокрутки, за исключением всегда внизу, является рискованной, если вы не работаете в процентах. Независимо от того, решает ли отключение прокрутки непосредственную проблему, если есть деловое требование помнить позицию пользователя, вы должны выполнить шаг проверки после обновления данных.

В качестве последнего предложения рассмотрим, как другие люди решили проблему отображения потоковых данных. Следовать хорошо известному шаблону - хорошая идея, так как он дает пользователю знакомый интерфейс. Зачастую с потоковыми данными поток имеет очень небольшой набор строк (достаточно, чтобы заполнить экран, а не 1000), но позволяет при необходимости вернуться назад и посмотреть на предыдущие «зарегистрированные» события. Еще раз, я не уверен, что ваше решение требует решения потокового типа, но вы все равно должны вернуться к основной бизнес-проблеме и начать с нее.

...