Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 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 строк нет смысла ограничился сотней в пределах выделенной строки вообщем код примерно такой:

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
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #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-сайт: neco.pisem.net
 Профиль | | #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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам