powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
19 сообщений из 19, страница 1 из 1
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39285994
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
MS VS 2015, приложение WinForms, не корректно отрисовывается первый столбец в ListView, при измененном цвете фона (мерцает, пропадают линии). Подробней на видео:
YouTube Video
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39287825
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А разве там нельзя сделать проще - поменять цвет текста и фона?
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39288016
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura-007,

А зачем тебе это свое рисование в Listview?
Зачем тебе виртуальный?
В обычном режиме нормально справляется с 10-20-30 тысяч итемов.
В динамическом режиме, когда много итемов обновляются в единицу времени. Проверял.
P.S. От варианта если делать LV через API, нетовский контрол отстает в скорости в 1,5-2 раза (груз навешенной .Net модели), но это приемлимо.

А цвета (текста и фона) -это CustomDraw, и если речь идет об итеме (строке) целиком, то в .Net помнится это уже имплементировано (хотя и с дефектами, по этой причине делал через API). Ну, если сабитемы раскрашивать, то тогда кажется только API.

Зачем тебе этот попугай?
Это некрасиво. Хочешь красиво, примени стиль "Explorer".
Всякого рода мерцания обычно связаны с избытком кода, когда какой-нибудь Refresh (отрисовка) делается непрерывно.
Скорее всего еще дефект реализации Listview в .Net , когда он перерисовывает например всякий раз весь итем целиком когда реально это не надо.
Бодаться с этим очень и очень тяжело. Без найтивных API как правило никак, и при этом еще и не всегда получается.
Мой совет: не используй "виртуальный режим".
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39288071
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,
Можно, но если не в виртуальном режиме.
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39288082
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
Спасибо за советы.
Рисование, а именно изменение фона, нужно, т.к. есть задача такая.
Список для отображения, постоянно динамически меняется, в обычном режиме обновление работает не так хорошо, как в виртуальном, поэтому его и использую. Хотя ты говоришь об обратном, может я конечно что не так делал. В целом все работает хорошо, список из нескольких тыс. строк отображается корректно, сортировка по столбцам, фильтры, все мгновенно, проблема только с отрисовкой первого столбца.
Стиль "Explorer" это что имеется в виду? Ссылку можно?
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39288086
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй использовать тройную буферизацию
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39288088
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
yura-007Cat2,
Можно, но если не в виртуальном режиме.
А что, енсть разница для отрисовки?
Просто интересуюсь. Как-то никогда не надо было использовfть ListView
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39288120
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,
В обычном режиме все просто, работа с айтамами ListView напрямую, делается один раз - айтем такой-то = цвет фона и все остальное такой-то и все отображается хорошо, но это вариант не плох если таблица не большая и данные в ней статические, чем больше таблица, тем процесс загрузки данных в ListView и их отображение медленней, хотя может это я что не так делаю, тут написали что и так все должно летать. В виртуальном режиме приходится обрабатывать события в которых задаем текст для отображения, форматирование и все остальное, схема сложней, но в ней у меня как раз все летает.
Я вот с этим полностью согласен:
Дмитрий77 Скорее всего еще дефект реализации Listview в .Net , когда он перерисовывает например всякий раз весь итем целиком когда реально это не надо.
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39288417
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura-007Стиль "Explorer" это что имеется в виду? Ссылку можно?

Код: vbnet
1.
2.
3.
4.
  Public Declare Unicode Function SetWindowTheme Lib "uxtheme.dll" _
   (ByVal hWnd As IntPtr, ByVal pszSubAppName As String, ByVal pszSubIdList As String) As Integer

SetWindowTheme(ListView1.Handle, "explorer", vbNullString)



И чтоб не мерцал больше чем надо (но это для нормального):
Код: vbnet
1.
2.
3.
4.
    Dim lStyle As Integer
   lStyle = SendMessage(ListView1.Handle, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0)
    lStyle = lStyle Or LVS_EX_DOUBLEBUFFER
    Call SendMessage(ListView1.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, lStyle)
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39289033
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77yura-007Стиль "Explorer" это что имеется в виду? Ссылку можно?

Код: vbnet
1.
2.
3.
4.
  Public Declare Unicode Function SetWindowTheme Lib "uxtheme.dll" _
   (ByVal hWnd As IntPtr, ByVal pszSubAppName As String, ByVal pszSubIdList As String) As Integer

SetWindowTheme(ListView1.Handle, "explorer", vbNullString)



И чтоб не мерцал больше чем надо (но это для нормального):
Код: vbnet
1.
2.
3.
4.
    Dim lStyle As Integer
   lStyle = SendMessage(ListView1.Handle, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0)
    lStyle = lStyle Or LVS_EX_DOUBLEBUFFER
    Call SendMessage(ListView1.Handle, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, lStyle)


Спасибо за подсказку, даже не слышал о таком.
В общем состряпал проект MS VS 2015 WinForm c#, на форме 3 ListView (обычный, виртуальный и Explorer), у всех включена двойная буферизация (в событии FormLoad).
Итого, если требуется отобразить 100000 строк по 10 столбцов, при условии что значения в 8 столбцах каждую секунду меняются, на моем древнем ноутбуке (emachines e430 (AMD Sempron(tm) M100 2.0 GHz)), наиболее адекватно работает виртуальный ListView, при этом если просто загрузить статические 100000 строк и не обновлять значения, лучше работают два других, Explorer ListView совсем хорошо. Еще для виртуального сделал сортировку, т. к. наработки были, для остальных не заморачивался, обычно она требуется, как и раскраска отдельных строк. Проблема виртуального ListView обозначенная в данной теме понятное дело присутствует.
В общем проект прикрепляю, сделал как умею, это совсем не значит что сделал правильно, любые замечания приветствуются, советы тем более!
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39289342
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura-007Итого, если требуется отобразить 100000 строк по 10 столбцов, при условии что значения в 8 столбцах каждую секунду меняются,
Мне кажется что сто тысяч строк с обновлением каждую секунду ВСЕХ ста тысяч строк это таки перебор.

Для моей задачи я тестировал 30-50тыс. строк, но при этом обновлялись за секунду м.б. 30-50.
Чтоб если юзер смотрит в данный момент на эти 30-50 чтоб там ничего не глючило.
Это на тесте, потому как на практике обычно этих строк 2-3 сотни и обновляются за секунду м.б. 2-3.

Он по любому сдохнет при выполнении вашей задачи, если не в теч. первых секунд то в течении первой минуты точно.
У вас комп элементарно не успевает за кодом (на эту операцию - обновить 100000 строк не хватит одной секунды).

На загрузку 50000 строк с реальной информацией (а не с вашим циклом) нужно только скажем секунд 10 (а .Net это время еще и умножает на 2).
А вы по всей (100000 строк!!!) конструкции еще собираетесь долбить каждую секунду.
Да еще и раскрашивать чего-то в красные цвета.

Я с "виртуальным" не работал, м.б. он и предназначен для таких монстро-объемов.
Но уж по крайней мере красным то мазать по нему не стоит, если вам важны данные а не мазня на продажу (на продажу кстати данный вид все равно не катит).
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39289461
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
Мне тоже так кажется, но задачи бывают разные и тому кто их генерирует может как раз таки так не казаться. Количество строк, согласно задачам, часто зависит от юзера, сколько он туда запихает, столько и должно отображаться, поэтому полезно быть готовому к самому печальному варианту.
Виртуальный режим тем и хорош, что нет никаких строк, есть список в оперативной памяти который как бы проецируется в ListView. Благодаря чему разницы нет сколько строк отображать, тысяча, сто тысяч, миллион, скорость его работы будет примерно одна и та же (имеется ввиду его взаимодействия с юзером, а не обновление данных). Он работает медленней, в силу своих особенностей, при увеличении отображаемых столбцов и отображаемых строк, прокрутка работает медленней.
На счет раскраски, тоже задачи могут быть разные, на данный момент требуется просто фон для особо важных строк красить красным и отображать всегда сверху. До этого проекта, была задача, нужно было красить разными цветами, в зависимости от значений в ячейках. Не думаю что раскраска это серьезная проблема, 10 т. строк в прикрепленном выше проекте красятся нормально в любом ListView. Кроме раскраски еще должна работать сортировка, т.е. сначала данные обновляются, затем сортируются в порядке заданном ранее юзером и только после этого отображаются.
На счет "раз в секунду" я не совсем правильно выразился, это задержка 1 сек. между итерациями обновления данных в фоновом потоке. Понятно что процесс обновления 100000 строк не быстрый, но он ведь происходит за кулисами, пока юзер листает то что есть и если ему требуется такое огромное количество строк, то его нужно просто подготовить к тому что "раз в секунду" может не получится.
Тут еще тройную буферизацию предлагали, этого еще не пробовал, потому что понятия не имею что это такое и как ее пробовать.
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39289993
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura-007Понятно что процесс обновления 100000 строк не быстрый, но он ведь происходит за кулисами,
Какая разница, за кулисами или нет у вас прога встанет. Если ваш код и все что за этим следует, который вы долбите раз в секунду не выполнится за эту секунду.
Даже если это как то и вытянет, вам юзеры предъявят 100% CPU.
Я например местами злоупотребляю DoEvents (абсолютно безобидно, показывает м.б. 1-2сек пока выполняется другой процесс но умники кот. да и укажут на загрузку проца таки иногда находятся). В моем случае загрузка фальшивая, а в вашем самая что ни на есть настоящая.
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39290124
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
Вы конечно правы, обновление 100000 строк тяжеловатая задача. Но на счет того что прога встанет, можно поспорить. Зависит конечно не в последнюю очередь, как эта прога написана и на чем она будет запускаться. На более менее современном ПК с пятигодовалым i7 тот проект который я здесь выкладывал не встает и проц. даже на 50% не грузится, данные обновляются с интервалом в 2 сек. (1 сек. задержка) и так работает как при запуске программы, так и через сутки непрерывной работы. Тестировал в ОС Windows 10, запущенной в VMWare Player запущенном в ОС Ubuntu на ноутбуке.
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39290135
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura-007Зависит конечно не в последнюю очередь, как эта прога написана
MS Access легко показывает миллионы строк из ODBC источника
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39290143
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилyura-007Зависит конечно не в последнюю очередь, как эта прога написана
MS Access легко показывает миллионы строк из ODBC источника
Вопрос в частоте обновления отображаемых данных и затрачиваемых на это ресурсов.
А вообще вопрос в заголовке темы .
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39290149
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura-007,

только первый столбец ? добавьте фиктивный в одно пиксель шириной
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39290153
yura-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
Обычно такие костыли и использую. Хочется же все таки без колхоза)
...
Рейтинг: 0 / 0
Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
    #39290176
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura-007,

без колхоза - открыть сорцы и разобраться, что происходит с первой колонкой. Трудозатратно однако
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Некорректная отрисовка первого столбца ListView в виртуальном режиме, WinForms.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]