C# Windows Forms. Использование ListView для логов, автоматическая прокрутка ListView, избавление от
Иногда надо отображать пользователю ход процесса, т.е., что в данный момент наша программа делает. Лучше всего, на мой взгляд, для такого подходит компонент
ListView
.В него будем писать лог наших действий. Замутим тестовое приложение:
- Создадим форму с
ListView
и кнопкой "Начать"- По нажатию кнопки "Начать" запустим отдельный поток, который будет выводить нам числа от 1 до 100, и генерировать событие.
В коде или в конструкторе установим основные опции для
ListView
. Нам нужно, чтобы он отображал все, как список. Ну так, как выводится лог в консоль. Устанавливаем соответствующие свойства:View = Details
Теперь идем в конструктор, ищем опцию
Columns
, и добавляем единственную колонку:В появившемся окне все удаляем из поля
Text
, жмем OK, смотрим на размер (Size
) ListWiev
, возвращаемся в редактирование колонок, и правим свойство Width
. Устанавливаем чуть меньше, чем размер самого ListWiev
. Отладили, посмотрели чтоб было красиво? Ставим
HeaderStyle = None
(чтоб не отображался заголовок колонки, заголовки были убраны).Несмотря на то, что все действия происходят в отдельном потоке,
ListView
дергается и дрожит:https://youtu.be/6Un0TSmyw38
На GitHub
Для этого делаем новый контрол, наследник от
ListView
и в коде нового класса подправляем параметр отображения:class MyListView:ListView
{
public MyListView()
{
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
}
}
Используем новый контрол вместо
ListView
. Ничего не дрожит и не дергается.При добавлении нового элемента:
Достаточно при добавлении в
ListView
устанавливать свойство TopItem
в значение последнего элемента. Тогда у ListView
появится автоматическая прокрутка:lvOut.TopItem = lvOut.Items[lvOut.Items.Count - 1]
;https://youtu.be/IzPIf5X8zQQ
На GitHub
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/09/05/c-wi