Страница: 1 |
Страница: 1 |
Вопрос: Обновление данных...
Добавлено: 22.05.06 08:30
Автор вопроса:
Денис | ICQ: 109593029
Всем привет. Такой вопрос, объект ListView (View = Detals) содержит более 1000 строк, загрузка строк происходит при открытии формы, как сделать обновление данных в этих строках?
Я сделал следующим образом: с помощью объекта Timer, через интервал времени, перебором строк обновляю данные, но сложность заключаеться в том что строк много и программа как бы подвисает до окончания перебора. Как сделать так чтобы пользователь этого не замечал и обновление не мешало работать?
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа: SRV
ICQ: 254226129
Вопросов: 30
Ответов: 107
Профиль | | #1
Добавлено: 22.05.06 09:53
Обычно тот код который у тебя при загрузке я помещаю в модуль, процедуру скажем Public Sub LoadListView() тогда при добавлении или редактировании вызывать эту процедуру, максимум 2 секунды и ЛистВиев обновлённый, да, и не забыть перед обновлением сделать ListView.Clear DoEvents
Номер ответа: 2
Автор ответа: Денис
ICQ: 109593029
Вопросов: 15
Ответов: 32
Профиль | | #2
Добавлено: 22.05.06 10:46
Пробывал, записей много затрудняет работу, пока загрузка идет пользователь ничего не может сделать прога стопориться. Грузиться 1200 строк примерно секунд 10-12.
Можно ли процедуру загрузки сделать как бы фоновой?
Такая фигня у меня при обработке данных, когда я для видимости использую объект "ПРОЦЕСС", стоит только дернуть курсором, прога стопориться, индиктор "Процесса" останавливается, но данные обрабатываются.
Номер ответа: 3
Автор ответа: Денис
ICQ: 109593029
Вопросов: 15
Ответов: 32
Профиль | | #3
Добавлено: 22.05.06 10:57
Я ошибся, 10-12 сек. грузиться 40 тыс. строк, а 1200 быстро.
но очистка списка не желательна, надо обновлять те строки, которые в списке.
Список строиться под определнным условием, если заново его заполнить, то отредактированные строки изчезнуть, а это не желательно.
Номер ответа: 4
Автор ответа: SRV
ICQ: 254226129
Вопросов: 30
Ответов: 107
Профиль | | #4
Добавлено: 22.05.06 14:07
Мдя.. даже незнаю что сказать, а пробовал While ... Wend может он быстрее прокрутит
Номер ответа: 5
Автор ответа: Денис
ICQ: 109593029
Вопросов: 15
Ответов: 32
Профиль | | #5
Добавлено: 22.05.06 16:22
Вообщем, решил проблему следующим образом: обновлять сразу все 1000 строк нет смысла ограничился сотней в пределах выделенной строки вообщем код примерно такой:
If Me.ListView.Items.Count > 0 Then
For i = Me.ListView.TopItem.Index To Me.ListView.TopItem.Index + 100
Dim item As ListViewItem = Me.ListView.Items(i)
item.SubItems(1).Text = "Текст1"
item.SubItems(2).Text = "Текст3"
item.SubItems(3).Text = "Текст3"
Next
End If
Эта процедура повтаряеться каждые 30 сек. по таймеру. Давольно быстро, но все равно во время выполнения ЛистВиев помигивает.
Если кто-то знает вариант лучше предложите, я буду признателен...
Номер ответа: 6
Автор ответа: Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #6
Добавлено: 22.05.06 17:41
А что за язык?
Если .net, то юзай виртуальный список - будет обновляться только видимая часть списка. Принудительно, раз в 30 секунд можно делать Refresh, я думаю...
Но насколько я знаю net'овские списки - подмигивать один фиг будет - это у них врождённое. Главное, чтоб не подтормаживало.
Если же vb6, то как минимум можно скрыть (visible=false) список, пока обновляешь - должно немного ускориться.
Номер ответа: 7
Автор ответа: Денис
ICQ: 109593029
Вопросов: 15
Ответов: 32
Профиль | | #7
Добавлено: 22.05.06 18:54
Язык VB.NET. А что за виртуальный список? Никогда не слышал про это.
В принципе у меня так и получается, что обновляется видимая часть списка, даже чуть больше.
Номер ответа: 8
Автор ответа: Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #8
Добавлено: 22.05.06 19:18
Предположим есть массив размером 10 000 {a,b,c} и надо его отобразить в списке. Тогда ставишь списку VirtualMode=true, VirtualListSize=10000 и в событии RetrieveVirtualItem делаешь что-то типа:
Но, повторюсь, чтобы избежать застаивания данных (если список не будет прокручиваться, элементы не будут перезапрашиваться), пожалуй, надо делать что-то принудительно.
Кроме того, всегда вставляй код обновления нескольких элементов между
lstReport.ResumeLayout()