Страница: 1 |
|
Вопрос: ListView виртуальный режим и Access
|
Добавлено: 12.04.09 15:02
|
|
Автор вопроса: rw12lq
|
Есть ListView в виртуальном режиме. Помогите примером, как заполнить ListView данными из базы данных.
В Sub ListView1_RetrieveVirtualItem идет постояный вызов обновления элементов. И если подключаться к базе из этой процедуры, то естественно все тормозит..
Подскажите, как правильно реализовать... Здесь есть человек по имени fluke, тоже терроризирует listview и virtual mode.. Если ты здесь появишься, напиши, пожайлуста как с тобой связаться...
Заранее всех благодарю..
Ответить
|
Номер ответа: 1 Автор ответа: fluke
ICQ: 318170731
Вопросов: 15 Ответов: 96
|
Профиль | | #1
|
Добавлено: 14.04.09 10:25
|
OnRetrieveVirtualItem это просто отрисовка элементов, которые видны. она естественно срабатывает даже при малейшем движении. Есть OnCacheVirtualItems, из названия я думаю понятно, что срабатывает только один раз перед изменением отображаемых данных. Кэшируешь в этой процедуре список но не весь, а только диапазон элементов, который OnCacheVirtualItems запрашивает. а в OnRetrieveVirtualItem обращаешься к уже готовым элементам (тобишь экземпляры Item и SubItem). Еще один момент. OnCacheVirtualItems тоже не панацея, если записей много и плавно прокручивать список, то постоянно будут запрашиваться новые элементов.
вот пример с MSDN, он не оптимальный, но понять как это работает можно. Если интересует быстродействие, обращайся в аську. Я в профиле сейчас запишу
-
- Public Class Form1
- Inherits Form
- Private myCache() As ListViewItem
- Private firstItem As Integer
- Private WithEvents listView1 As ListView
-
- Public Shared Sub Main()
- Application.Run(New Form1)
- End Sub
-
- Public Sub New()
-
- listView1 = New ListView()
- listView1.View = View.SmallIcon
- listView1.VirtualMode = True
- listView1.VirtualListSize = 10000
-
-
- Me.Controls.Add(listView1)
-
-
-
-
- Dim lvi As ListViewItem = listView1.FindItemWithText("111111")
-
-
- If Not (lvi Is Nothing) Then
- listView1.SelectedIndices.Add(lvi.Index)
- listView1.EnsureVisible(lvi.Index)
- End If
-
- End Sub
-
-
-
- Private Sub listView1_RetrieveVirtualItem(ByVal sender As Object, ByVal e As RetrieveVirtualItemEventArgs) Handles listView1.RetrieveVirtualItem
-
-
-
-
- If Not (myCache Is Nothing) AndAlso e.ItemIndex >= firstItem AndAlso e.ItemIndex < firstItem + myCache.Length Then
-
- e.Item = myCache((e.ItemIndex - firstItem))
- Else
-
- Dim x As Integer = e.ItemIndex * e.ItemIndex
- e.Item = New ListViewItem(x.ToString())
- End If
-
-
- End Sub
-
-
-
- Private Sub listView1_CacheVirtualItems(ByVal sender As Object, ByVal e As CacheVirtualItemsEventArgs) Handles listView1.CacheVirtualItems
-
-
- If Not (myCache Is Nothing) AndAlso e.StartIndex >= firstItem AndAlso e.EndIndex <= firstItem + myCache.Length Then
-
-
- Return
- End If
-
-
- firstItem = e.StartIndex
- Dim length As Integer = e.EndIndex - e.StartIndex + 1
- myCache = New ListViewItem(length) {}
-
-
- Dim x As Integer = 0
- Dim i As Integer
- For i = 0 To length
- x = (i + firstItem) * (i + firstItem)
- myCache(i) = New ListViewItem(x.ToString())
- Next i
-
- End Sub
-
-
-
- Private Sub listView1_SearchForVirtualItem(ByVal sender As Object, ByVal e As SearchForVirtualItemEventArgs) Handles listView1.SearchForVirtualItem
-
-
-
-
- Dim x As Double = 0
- If [Double].TryParse(e.Text, x) Then
- x = Math.Sqrt(x)
- x = Math.Round(x)
- e.Index = Fix(x)
- End If
-
-
-
-
- End Sub
-
- End Class
Ответить
|
Страница: 1 |
Поиск по форуму