Тема наверное уже въелась, опятьTreeview

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

Тема наверное уже въелась, опятьTreeview

Сообщение fishmen » 19.06.2007 (Вт) 13:12

Может я что-то не догоняю, подскажите плиз.
Из базы получаю данные, чтобы заполнить дерево с помощью Treeview.
В таком виде: код, наименование, родительский узел .
пример
1, имя1, 0
1, имя2, 1
Проблема в том, что данные могут быть выгружены вот в такой очередности
1, имя2, 1
1, имя1, 0

В результате при добавлении узла
TV.Nodes.Add "_" & rs.Fields(2).Value, tvwChild, "_" & rs.Fields(0).Value, rs.Fields(1).Value

Получаю ошибку element not found, что и понятно, т.к. ключ родительской записи пока неопределен.
Так что делать, предварительно правильно сортировать записи? Тогда зачем мне Treeview.
Вопрос простой, но действительно застопорился.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Тема наверное уже въелась, опятьTreeview

Сообщение tyomitch » 19.06.2007 (Вт) 13:29

fishmen писал(а):Так что делать, предварительно правильно сортировать записи? Тогда зачем мне Treeview.

А действительно, зачем тебе Treeview?
Только для сортировки, что ли?
Изображение

fishmen
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 14.09.2005 (Ср) 8:52

Сообщение fishmen » 19.06.2007 (Вт) 16:29

Немного расширю вопрос.
как правильно использовать рекурсию при работе с рекордсетом?
как его открывать в рекурсии?
Или в каждой рекурсии объявлять свой рекодсет?
Public Sub GenerateRecursive(Parent As String)
Dim rs_a_doc As New ADODB.Recordset
sql_dgroup = "select a_cod_val, a_name, a_group_up from r_dgroup where a_group_up = '" & Parent & "'"
Set rs = frmMain.cn.Execute(sql_dgroup)
If rs.EOF And rs.BOF Then
Else
rs.MoveFirst
While Not rs.EOF
If rs.Fields(2) = "*" Then
TV1.Nodes.Add , , "_" & rs.Fields(0).Value, rs.Fields(1).Value
TV1.Nodes.Item("_" & rs.Fields(0).Value).Expanded = True
Else
TV1.Nodes.Add "_" & rs.Fields(2).Value, tvwChild, "_" & rs.Fields(0).Value, rs.Fields(1).Value
End If
GenerateRecursive rs.Fields(0)
rs.MoveNext
Wend
End If
rs.Close
Set rs = Nothing
End Sub

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.06.2007 (Вт) 16:48

При работе с рекордсетом использовать рекурсию вообще не правильно. Заполнить дерево из рекордсета можно и без нее, причем вытащив сразу весь список, а не кусками. Если соблюдается условие id>parentid, то можно заполнить за один проход, если не соблюдается, то за два.
Код: Выделить всё
    rsDir.Sort = "ParentID"
    On Error Resume Next
    While Not rsDir.EOF
        If IsNull(rsDir!ParentID) Then
            tvTree.Nodes.Add , , "i" & rsDir(0).Value, rsDir!Name_RU
        Else
            Set nd = tvTree.Nodes.Add("i" & rsDir!ParentID, 4, "i" & rsDir(0).Value, rsDir!Name_RU)
        End If
        rsDir.MoveNext
    Wend
Это если соблюдается. Если нет, сначала просто добавляешь все узлы, потом проставляешь Parent каждому узлу.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение alibek » 19.06.2007 (Вт) 19:29

Antonariy писал(а):если не соблюдается, то за два.

Только для одноуровневой иерархии (родитель-дочка).
Lasciate ogni speranza, voi ch'entrate.

fishmen
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 14.09.2005 (Ср) 8:52

Сообщение fishmen » 20.06.2007 (Ср) 8:26

Ндаа.., в том то и дело, что глубина может быть произвольная. Может есть обходные пути, например выгрузить данные в массив, а потом его как-то преобразовать? Так ведь Treeview и нужен, чтобы привести данные к иерархическому виду, а тут еще надо выполнить кучу подготовительных работ.

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

Сообщение alibek » 20.06.2007 (Ср) 8:29

Почитай про Nested Sets, изобретать велосипед не нужно.
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 20.06.2007 (Ср) 8:40

Судя по запросу, у автора как раз одноуровневая иерархия, а какая глубина - без разницы. fishmen, выполни запрос
Код: Выделить всё
select * from r_dgroup where a_group_up > a_cod_val
Если выборка будет пустая, то первого способа более, чем достаточно. А для Nested Sets придется переделывать таблицу.
Лучший способ понять что-то самому — объяснить это другому.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

А как насчёт этого?

Сообщение Rojohn » 25.06.2007 (Пн) 8:12

Прошу меня простить, что вмешиваюсь, а можно ли добавить следующий node дерева перед предыдущим без обновления всего дерева, а за одну операцию? Если да, то как это написать?
Спасибо!
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение alibek » 25.06.2007 (Пн) 8:18

Зависит от того, как у тебя дерево построенно.
Как правило можно.
Если я тебя правильно понял, конечно.
Lasciate ogni speranza, voi ch'entrate.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

...

Сообщение Rojohn » 25.06.2007 (Пн) 9:32

Дерево построено втупую последовательным присвоением нодов. С помощью предварительной сортировки или из базы я сам знаю как обновлять, но тут просто нужно избежать лишей операции обновления дерева. А вот можно ли присвоить ноды не последовательно, а перед другим дочерним нодом? Вот код:
Код: Выделить всё
Sub AddNode(ind1 As String, ind2 As String, text As String, img As Integer)
  Set mNode = tvwAddList.nodes.Add(ind1, tvwChild, ind2, text, img)
  Set mNode = mNode.parent
  mNode.Expanded = False
End Sub
А это само построение дерева:
  With tvwAddList
    .nodes.Clear
    Set mNode = .nodes.Add(, , "K", "Первый элемент", 1)
    mNode.Expanded = False
    AddNode "K", "S1", "Дочерний нод", 1
    AddNode "K", "S0", "Следующий нод (должен встать перед Дочерним)", 1
End With
Последний раз редактировалось Rojohn 25.06.2007 (Пн) 9:37, всего редактировалось 1 раз.
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение Хакер » 25.06.2007 (Пн) 9:36

Rojohn
Что за процедура AddNode у тебя в коде?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

..

Сообщение Rojohn » 25.06.2007 (Пн) 9:38

Sorry... это я просто для себя упростил... вот, добавил её.
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

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

Сообщение Хакер » 25.06.2007 (Пн) 9:42

tvwPrevious вместо tvwChild, "S1" вместо "K" при добавлении "S0"
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

!

Сообщение Rojohn » 25.06.2007 (Пн) 9:59

Да! Как бы работает! Спасибо огромное! И как это я сам не догадался:)
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 68

    TopList