Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Быстрая очистка TreeView Добавлено: 17.02.04 11:26  

Автор вопроса:  Атос

Привет.

Есть дерево, содержащее примерно 3500 узлов. Его нужно очистить. Nodes.Clear очищает дерево за 1-2 минуты...Что самое интересное, заполняется дерево быстро - около секунды, а вот с очиткой непонятные проблемы.

Подскажите, пожалуйста, способы более быстрой очистки TreeView.

И есть ещё один вопрос: можно ли на время очистки отключить прорисовку у компонента TreeView или всего приложения?

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 boevik



Хранитель чата

ICQ: 137392264 

Вопросов: 8
Ответов: 557
 Web-сайт: www.hypertech.ru
 Профиль | | #1
Добавлено: 17.02.04 12:12

Интересно, а как ты очищаешь дерево?

Treeview1.Nodes.Clear - очищает все ноды сразу.

Ответить

Номер ответа: 2
Автор ответа:
 Атос



Вопросов: 2
Ответов: 7
 Профиль | | #2 Добавлено: 17.02.04 12:19

Я пробовал очищать дерево двумя способами:

1-ый - Nodes.Clear,

2-ой - написал свою рекурсивную процедуру.

Большой разницы между ними нет, и то и другое работает медленно.

Мне как раз нужно очистить все дерево.

У меня есть две классификации товаров - по поставщикам ("Весна", "Калина" и т.д.) и по назначению (зубн. пасты, стир. порошки и т.д.). Нужно иметь возможность быстро переключаться из одной классификации в другую. Для этого нужно быстро очищать дерево. И вот тут неожданно возникла проблема :(

Ответить

Номер ответа: 3
Автор ответа:
 Gloom



Вопросов: 0
Ответов: 36
 Профиль | | #3 Добавлено: 17.02.04 14:01

Private Sub ClearTreeView(ByVal tv As TreeView)
    Dim tvHwnd As Long
    Dim lNodeHandle As Long
   
    tvHwnd = tv.hwnd
   
    SendMessageLong tvHwnd, WM_SETREDRAW, CLng(0), CLng(0)
   
    Do
        lNodeHandle = SendMessageLong(tvHwnd, TVM_GETNEXTITEM, TVGN_ROOT, CLng(0))
        If lNodeHandle > 0 Then
            SendMessageLong tvHwnd, TVM_DELETEITEM, CLng(0), lNodeHandle
        Else
            Exit Do
        End If
    Loop
   
    SendMessageLong tvHwnd, WM_SETREDRAW, CLng(1), CLng(0)
End Sub

Ответить

Номер ответа: 4
Автор ответа:
 Атос



Вопросов: 2
Ответов: 7
 Профиль | | #4 Добавлено: 17.02.04 14:54

Я попробовал - не работает :(

Дерево не очищается, потому что lNodeHandle = SendMessageLong(tvHwnd, TVM_GETNEXTITEM, TVGN_ROOT, CLng(0)) всегда возвращает ноль, независимо от того, пустое дерево или нет....

Ответить

Номер ответа: 5
Автор ответа:
 Gloom



Вопросов: 0
Ответов: 36
 Профиль | | #5 Добавлено: 17.02.04 15:40

Может константы криво объявил?

Private Const TV_FIRST As Long = &H1100
Private Const TVM_GETNEXTITEM As Long = (TV_FIRST + 10)
Private Const TVM_DELETEITEM  As Long = (TV_FIRST + 1)
Private Const TVGN_ROOT As Long = &H0

Ответить

Номер ответа: 6
Автор ответа:
 Атос



Вопросов: 2
Ответов: 7
 Профиль | | #6 Добавлено: 17.02.04 15:48

Так работает :)....

Только все равно медленно.... Чуть-чуть быстрее чем Clear, но все равно медленно...

Напиши мне еще значение константы WM_SETREDRAW...

Мне кажется, обновление все таки не отключается.

Ответить

Номер ответа: 7
Автор ответа:
 Gloom



Вопросов: 0
Ответов: 36
 Профиль | | #7 Добавлено: 17.02.04 15:50

Держи:

Private Const WM_SETREDRAW As Long = &HB

Ответить

Номер ответа: 8
Автор ответа:
 Атос



Вопросов: 2
Ответов: 7
 Профиль | | #8 Добавлено: 17.02.04 15:57

Класс! Просто супер! Скорость супер!

Спасибо большущее

Ответить

Номер ответа: 9
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #9
Добавлено: 17.02.04 20:20

> Нужно иметь возможность быстро переключаться из одной классификации в другую. Для этого нужно быстро очищать дерево.

Зачем? Создай несколько деревьев и меняй ZOrder...

Ответить

Номер ответа: 10
Автор ответа:
 Атос



Вопросов: 2
Ответов: 7
 Профиль | | #10 Добавлено: 18.02.04 09:54

Деревья большие, поэтому не хочется постоянно хранить их в памяти.

К тому же, теперь проблем с деревьями нет :)

Ответить

Номер ответа: 11
Автор ответа:
 OAN



Вопросов: 2
Ответов: 17
 Профиль | | #11 Добавлено: 23.02.04 20:15

Я бы порекомендовал сменить SelectedItem на корневой:

    Set TreeView1.SelectedItem = TreeView1.Nodes(1).Root
    TreeView1.Nodes.Clear

Ответить

Страница: 1 |

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



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