Страница: 1 |
Вопрос: Обновление данных... | Добавлено: 22.05.06 08:30 |
Автор вопроса: ![]() |
Всем привет. Такой вопрос, объект ListView (View = Detals) содержит более 1000 строк, загрузка строк происходит при открытии формы, как сделать обновление данных в этих строках?
Я сделал следующим образом: с помощью объекта Timer, через интервал времени, перебором строк обновляю данные, но сложность заключаеться в том что строк много и программа как бы подвисает до окончания перебора. Как сделать так чтобы пользователь этого не замечал и обновление не мешало работать? |
Ответы | Всего ответов: 8 |
Номер ответа: 1 Автор ответа: ![]() ![]() 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 Автор ответа: ![]() ![]() ICQ: 254226129 Вопросов: 30 Ответов: 107 |
Профиль | Цитата | #4 | Добавлено: 22.05.06 14:07 |
Мдя.. даже незнаю что сказать, а пробовал While ... Wend может он быстрее прокрутит |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: 109593029 Вопросов: 15 Ответов: 32 |
Профиль | Цитата | #5 | Добавлено: 22.05.06 16:22 |
Вообщем, решил проблему следующим образом: обновлять сразу все 1000 строк нет смысла ограничился сотней в пределах выделенной строки вообщем код примерно такой:
Dim i As Integer
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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 247906854 Вопросов: 133 Ответов: 882 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 22.05.06 19:18 |
Предположим есть массив размером 10 000 {a,b,c} и надо его отобразить в списке. Тогда ставишь списку VirtualMode=true, VirtualListSize=10000 и в событии RetrieveVirtualItem делаешь что-то типа:
e.Item = New ListViewItem("!!!"
![]() Но, повторюсь, чтобы избежать застаивания данных (если список не будет прокручиваться, элементы не будут перезапрашиваться), пожалуй, надо делать что-то принудительно. Кроме того, всегда вставляй код обновления нескольких элементов между lstReport.SuspendLayout()
lstReport.ResumeLayout() |
Страница: 1 |
|