MIT писал(а):Выкладывай код заполнения/изменения элементов ListView`а, будем разбираться
'==========================================================================
'
' Процедура формирует массив папкок и файлов и заполняет ими ЛистВью
'
Private Sub FillingListViews(ByVal sDir As String, ByVal lv As ListView, _
Optional ByVal sDirOther As String = NS, _
Optional ByVal lvOther As ListView = Nothing, _
Optional ByVal oCursor As Cursor = Nothing)
Dim arrF(,) As String
Dim arrOther(,) As String
Dim bOther As Boolean = False
'
ReDim arrF(F_PATH, 0)
ReDim arrOther(F_PATH, 0)
'
If oCursor Is Nothing Then MyBase.Cursor = Cursors.WaitCursor
'
' Добавление в "виртуальный" ListView иконок папок
'
With milIcon.Images
.Clear()
.Add(ICON_FLD_COLL, ilIcon.Images(ICON_FLD_COLL))
.Add(ICON_FLD_EXP, ilIcon.Images(ICON_FLD_EXP))
End With
'
' Заполнение массива путями к папкам и файлам
'
FillingArrays(sDir, arrF, sDirOther, arrOther)
'
' Заполнение первого ЛистВью
'
FillingListView(sDir, lv, arrF)
'
bOther = (sDirOther.Length > 0)
bOther = bOther And Not lvOther Is Nothing
If bOther Then
' Заполнение второго ЛистВью
FillingListView(sDirOther, lvOther, arrOther)
End If
'
If oCursor Is Nothing Then MyBase.Cursor = Cursors.Default
'
End Sub
'=============================================================================
'
' Заполнение одного ЛистВью
'
Private Sub FillingListView(ByVal sDir As String, ByVal lv As ListView, ByRef arr(,) As String)
Dim i As Integer = 0
Dim ub As Integer = arr.GetUpperBound(1)
Dim lvItem(ub) As ListViewItem
'
With lv
.BeginUpdate()
For i = 0 To ub
.SmallImageList = milIcon
lvItem(i) = New ListViewItem
ListViewItemAdd(lvItem(i), arr, i)
Next
With .Items
.Clear()
.AddRange(lvItem)
End With
.EndUpdate()
End With
End Sub
'=============================================================================
'
' Добавление папки или файла в ЛистВью
'
Private Sub ListViewItemAdd(ByRef lvItem As ListViewItem, _
ByRef arrF(,) As String, ByVal i As Integer)
Dim sKey As String = arrF(F_ICON, i)
With lvItem
.SubItems.AddRange(mCol)
.SubItems(0).Text = arrF(F_NAME, i)
.SubItems(1).Text = arrF(F_EXTE, i)
.SubItems(2).Text = arrF(F_SIZE, i)
.SubItems(3).Text = arrF(F_TIME, i)
.Name = arrF(F_PATH, i)
.ToolTipText = .Name
If milIcon.Images.ContainsKey(sKey) Then
.ImageKey = sKey
Else
.ImageKey = ICON_NO_EXT
End If
End With
End Sub
'=============================================================================
'
' Добавление иконки файла в ЛистИмидж
'
Private Sub AddIcon(ByVal ffn As String)
Dim oIcon As Icon
Dim sKey As String = Path.GetExtension(ffn)
Dim hIcon As Integer
If sKey.Length > 0 Then
sKey = sKey.Substring(1)
If Not milIcon.Images.ContainsKey(sKey) Then
hIcon = GetIconHandle(ffn)
If hIcon > 0 Then
oIcon = Drawing.Icon.FromHandle(hIcon)
milIcon.Images.Add(sKey, oIcon)
Else
milIcon.Images.Add(sKey, ilIcon.Images(ICON_NOT_FOUND))
End If
End If
Else
' Расширение у файла может отсутствовать
If Not milIcon.Images.ContainsKey(ICON_NO_EXT) Then
milIcon.Images.Add(ICON_NO_EXT, ilIcon.Images(ICON_NO_EXT))
End If
End If
End Sub
наmilIcon.Images.Add(sKey, oIcon)
milIcon.Images.Add(sKey, oIcon.Clone)
MIT писал(а):Попробуй так:
В процедуре AddIcon
Замени строкуна
- Код: Выделить всё
milIcon.Images.Add(sKey, oIcon)
- Код: Выделить всё
milIcon.Images.Add(sKey, oIcon[b].Clone[/b])
И ilIcon.Images(...) на ilIcon.Images(...).Clone
А нафиг тебе массив (!) ListVIew?
И правда... Даже забыл с чего вдруг такое написалbrigval писал(а):Это не массив листвью, а массив элементов листвью.
Да, так намного быстрее, что хорошо заметно при добавлении 10-20 тысяч элеметнов, так как происходит всего лишь одно обращение к контролу вместо тех же 20 тысяч.brigval писал(а):Я применил этот способ заполнения листвью, потому что думаю, что он ускоряет заполнение. Хотя точно не знаю, так ли это на самом деле.
With milIcon.Images
.Clear()
.Add(ICON_FLD_COLL, ilIcon.Images(ICON_FLD_COLL))
.Add(ICON_FLD_EXP, ilIcon.Images(ICON_FLD_EXP))
End With
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2