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