VB6.0 Открытие узла в TreeView по ключу узла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kpblc
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 05.05.2006 (Пт) 15:42
Откуда: С.-Петербург

VB6.0 Открытие узла в TreeView по ключу узла

Сообщение kpblc » 25.05.2006 (Чт) 14:22

Доброго времени суток!
Как я могу "развернутьЭ дерево до узла (то есть как если бы пользователь до него руками добрался), если я знаю только его ключ (узел надо еще и активировать, то есть на нем спозиционировать курсор выделения)? Узел может находится на любом уровне вложенности. Примеры, которые я нашел в MSDN, показывают только варианты разворота всего дерева. Вариант
Код: Выделить всё
.Nodes(sOpenKey).Expanded = True
не срабатывает. Цикл
Код: Выделить всё
      For lCounter = 1 To .Nodes.Count
        If LCase(.Nodes(lCounter).Key) = LCase(sOpenKey) Then
          .Nodes(lCounter).Expanded = True
          Exit For
        End If
      Next lCounter
тоже мимо. Что и как надо сделать? Или последовательно проходить по FullPath узла, разворачивать каждый элемент? А как тогда "выделить" узел, который определен ключом?
Дополнительно: если такое вообще возможно, будет ли выполняться обработка TreeView_Expand или TreeView_NodeClick?
Спасибо.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 25.05.2006 (Чт) 14:30

Код: Выделить всё
with TREE.Nodes("key1")
.EnsureVisible
.Expanded=True
end with

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 25.05.2006 (Чт) 14:32

1) Верно ли то, что автор думает, что нужно сначала выделить узел, чтобы его раскрыть?

2) Правильно ли я понял?
Код: Выделить всё
A+
|
+-B
   +-C
     |
     +-Filamad
+-D
+-E


Развернуть все узлы до Filamad значит = развернуть A, затем, B затем C но не разорачивать сам Filamad
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kpblc
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 05.05.2006 (Пт) 15:42
Откуда: С.-Петербург

Сообщение kpblc » 25.05.2006 (Чт) 15:02

> Kost One : Не срабатывает. Скорее всего, я просто не разобрался. За наводку спасибо, погляжу.
> Хакер : 1) Ну с точки зрения пользователя-то так и происходит. Хотя как это будет в программе, я не очень представляю (все-таки не профи)
2) Да, именно так.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 25.05.2006 (Чт) 15:21

Делаем такую процедуру
Код: Выделить всё

Function ItemByKey(ByVal sKey As String) As Integer
      For lCounter = 1 To .Nodes.Count
        If LCase(.Nodes(lCounter).Key) = LCase(sKey) Then
          ItemByKey = lCounter
          Exit Function
        End If
      Next lCounter


А потом делаем вот что

Код: Выделить всё

xxx = кей узла, до которого нужно развернуть
fp = Tree.Nodes(ItemByKey(xxx)).FullPath
NodesBefore = split(fp, Tree.PathSeperator)
For i = LBound(NodesBefore) To UBound(NodesBefore)
Tree.Nodes(ItemByKey(NodesBefore(i))).Expand
Next i


Не проверял, поэтому может и не сработать...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.05.2006 (Чт) 16:10

Хакер писал(а):Делаем такую процедуру

Лучше не делаем, ибо глупо и не эффективно.
Правильным будет рекурсия с использованием Set N = N.Childs(1) и Set N = N.NextSibling, с ограничением по Children = 0.
Lasciate ogni speranza, voi ch'entrate.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Сообщение pronto » 25.05.2006 (Чт) 16:32

Однажды пришлось решать подобную задачу самому, но это было так давно...

Код: Выделить всё
Private Sub ExpandLastFolder(LastFolder As String) 'переход к папке на любую возможную глубину
Dim i As Integer, u As Integer, p As Integer, ch As Integer, s As Integer
Dim dopStr As String, sym As String
Dim Steps() As String

p = -1
For u = 1 To Len(LastFolder)
   sym = Mid$(LastFolder, u, 1)
   If sym = "\" Then ch = ch + 1
Next u
For u = 1 To ch
   For i = 1 To Len(LastFolder)
      sym = Mid$(LastFolder, i, 1)
      If sym = "\" Then
         s = s + 1
         If s = u Then
            p = p + 1
            ReDim Preserve Steps(p): Steps(p) = dopStr
            dopStr = "": s = 0
            Exit For
         Else
            dopStr = dopStr & sym
         End If
      Else
         dopStr = dopStr & sym
      End If
   Next i
   i = 1
Next u
ch = 1
For u = 0 To p
   For i = ch To AllNodes
      If tvwFolders.Nodes(i).Key = Steps(u) Then
         tvwFolders.Nodes(i).Expanded = True
         ch = i
         Exit For
      End If
   Next
Next
For i = ch To AllNodes
   If tvwFolders.Nodes(i).Key = LastFolder Then
      tvwFolders.Nodes(i).Selected = True
      Set xNewTreeNode = tvwFolders.Nodes(i)
      Call tvwFolders_NodeClick(xNewTreeNode)
      KeyOfExpFolder = LastFolder
      Exit For
   End If
Next
End Sub
O, sancta simplicitas!

kpblc
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 05.05.2006 (Пт) 15:42
Откуда: С.-Петербург

Сообщение kpblc » 26.05.2006 (Пт) 13:07

Спасибо! Все получилось!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 137

    TopList