| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка Windows Forms > ListView |
| Автор: zss 30.11.2006, 20:43 |
| не хотел задавать вопрос в соседней теме 1. можно ли сделать нужную колонку авторасширяемой ? и как ограничить минимальный размер - формой ? 2. есть поток, который обрабатывает данные и где-то раз в секунду отрисовывает их. Старые данные удаляются. а новые отрисовываются. Так вот происходит сильное мерцание Ни SuspendLayout ни BeginUpdate не помагают. как можно ускорить отрисовку ? |
| Автор: ivashkanet 30.11.2006, 20:51 | ||
DoubleBufered = true у формы |
| Автор: zss 30.11.2006, 20:53 |
поставил в первую очередь |
| Автор: mr.DUDA 1.12.2006, 12:36 | ||
Рисуем на чём ? Если не прямо на форме, а на панели или другом контроле - то DoubleBuffered не поможет, надо в классе контрола написать:
|
| Автор: DarkDragon 1.12.2006, 21:07 |
| ControlStyles.OptimizedDoubleBuffer - это вроде как я понял оптимизированный двойной буфер. ControlStyles.AllPaintingInWmPaint - Это короче вся отрисовка в сообщении WmPaint(вроде в WndProc метода у контрола) в совокупности дает немерцающее обновление (методом Refresh или Invalidate) На panel, control, usercontrol Да. |
| Автор: zss 1.12.2006, 22:29 |
ну... в самом деле сильно не помогло еще я заметил некую странность - например просто при расширении формы происходит такой сильный затуп, что все больше и больше возникает желание отказаться от .NET и перейти на старый и проверенный Builder C++ |
| Автор: Naum 2.12.2006, 09:48 | ||
|
| Автор: mr.DUDA 2.12.2006, 14:01 | ||||
ListView сделан на стандартном элементе управления Windows, поэтому новые фишки как двойная буферизация, не поддерживает. И переход на билдер не спасёт, если там тот же листвью используется (завёрнут в VCL). Побороть мерцание можно так: 1) для добавления нескольких строк в листвью, вместо Add использовать AddRange 2) или запрещать отрисовку на время добавления строк: ListViewEx.cs
Form1.cs
|
| Автор: zss 3.12.2006, 16:45 |
| mr.DUDA, а как правильно создавать этот класс. как класс или как компонент ? Если как компонент - то как унаследоваться от существующего, чтоб он был виден в ToolBox? З.Ы. Пока еще не создавал компоненты |
| Автор: mr.DUDA 3.12.2006, 19:07 |
Как угодно. В любом случае сам на тулбокс попадёт |
| Автор: zss 3.12.2006, 19:08 |
это как-это ? |
| Автор: mr.DUDA 3.12.2006, 19:10 |
При компиляции. |
| Автор: zss 3.12.2006, 22:42 | ||
| mr.DUDA, вроде мерцание победил - спасибо только появилась еще проблемма. Есть 2 ListView. Они отображают иерархию. Тоесть например
тоесть в первом ListView отображается классы В. Если щелкнуть на ListViewItem, то во втором должен отобразиться список классов А для него, но 1. Список 1 постоянно обновляется и теряет выделение (тоесть он сначала очищается, а потом заново заполняется т.к. может меняться). Как можно сохранить выделение? 2. У списка 2 в Tag храниться выбранный класс В из 1 списка. Хотелось бы при изменении самого В, чтоб автоматически менялся и список А (тоесть обновлялся). Как это правильно сделать? 3. Как вообще сказать списку обновиться (например чтоб отработал какой-нибудь его метод)? Тоесть хотелось бы завязать както оба ListView на данные. Может с помощью вспомогательного компонента. |
| Автор: mr.DUDA 3.12.2006, 23:08 |
| По идее, любой контрол можно замапить на источник данных (DataSet, коллекцию объектов etc.), но это не относится к ListView. Придётся всё делать вручную 1. Запоминать выделенный элемент по какому-л. признаку (значение в Tag, etc.) и ставить фокус на него после обновления. Если кол-во элементов не меняется, можно попробовать поиграться с позицией прокрутки (восстанавливать её в то же значение) 2. Обрабатывать события изменения айтема; или я что-то не так понял? 3. Update, Refresh |
| Автор: zss 3.12.2006, 23:11 | ||
а есть где-нибудь статейка по DataSet ? Что-то мне кажется он меня спасет |
| Автор: thomas 3.12.2006, 23:17 | ||
zss,
посмотри http://msdn.microsoft.com/library/rus/default.asp?url=/library/RUS/vbcon/html/vboriCodeExamplesForDataAccess.asp |
| Автор: zss 6.12.2006, 19:55 | ||
сделал чтоб выделения сохранялись. но есть все-равно косяк. метод который вызывается из отдельного потока и метод который запоминает выделение по щелчку мыши не дружат между собой. тоесть когда я щелкаю может происходить обновление и оно сразу снимается. приходится иногда по несколько раз щелкать. lock(this) не помагает. как можно правильно это синхронизировать чтоб при любых действиях пользователя списки не обновлялись ? |
| Автор: zss 10.12.2006, 18:38 | ||
очень нужен ртвет на этот вопрос |