TreeView + алгоритм

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

PUNK-GRUNGER
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 10.06.2004 (Чт) 14:22
Откуда: Украина, Николаев

TreeView + алгоритм

Сообщение PUNK-GRUNGER » 24.04.2006 (Пн) 23:16

Чувствую, скоро меня будут не любить даже на этом форуме %)

Но все равно попытаюсь написать вопрос (второй раз пишу.. потом свет вырубило... думаю "Может знак? Не писать?".. ну пойду против этих суеверий... тьху тьху тьху три раза):

Есть сайт. На котором есть скрипт, который возвращает с помощью рекурсивной функции на страницу все каталоги сайта (типа "карта сайта"), вот типа такого формата:
C:\
C:\Downloads\
C:\Downloads\1
C:\Downloads\2
C:\Downloads\3
C:\Downloads\3\1
C:\Downloads\3\2
C:\Downloads\3\2\1
C:\Windows
... Вобщем понятно я думаю. Моя задача вытащить это дело и засунуть в ТриВьюв в Ноды. Типа эксплорера чтобы было. Не поверите, уже часа два мучаюсь, голова не варит - не получается додумать - то оливье вдруг запахнет, то девушка мимо пройдет с попой %) А проблема сурьезная. Я уже даже индексы передавал, номера... крутил и так, и эдак. Очень жаль, что новый ТриВьюв не как в VB6.0, нельзя добавлять в N-ный нод новые ветки - все время Nodes.Count в корне равен только количеству корневых нодов, а не всех. Вобщем, не получается и с индексами. Помогите... Очень прошу)

P.S. В Факьюх смотрел. Не нашел.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.04.2006 (Вт) 4:18

Если бы мимо прошла девушка без попы, это было бы гораздо хуже, PUNK-GRUNGER, мой юный друг, и отвратило бы тебя от программирования навсегда...

http://bbs.vbstreets.ru/viewtopic.php?t=23804
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

PUNK-GRUNGER
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 10.06.2004 (Чт) 14:22
Откуда: Украина, Николаев

Сообщение PUNK-GRUNGER » 25.04.2006 (Вт) 9:51

GSerg, я писал: уже даже индексы передавал, номера... крутил и так, и эдак. Очень жаль, что новый ТриВьюв не как в VB6.0, нельзя добавлять в N-ный нод новые ветки .

Я индексами прикрутил... Но в VB.NET нету такого:
Add ([Relative], [Relationship], [Key], [Text], [Image], [Selected image])

Я уже и так и сяк. Т.е. я добился с сервера передачи данных точно такого же формата, как было описана в вашей ссылке. Но как оказалось потом TreeView не такой как в VB6.0... Т.е. если в ВБ6 ноды можно было добавлять только в TreeView.Nodes, то в vb.net такой номер не прокатил. От этого и проблема. Вот только проснулся (9:49 ща), поробую на чистую голову.

Может все-таки поможете? :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.04.2006 (Вт) 14:16

Дык PUNK-GRUNGER, ну если нет коллекции с доступом по ключу, ну почему нельзя её завести?

Код: Выделить всё
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim arr(4) As String, p As Integer

    arr(0) = "c:"
    arr(1) = "c:\foo"
    arr(2) = "c:\bar"
    arr(3) = "c:\foo\bar"
    arr(4) = "c:\bar\foo"

    Array.Sort(arr, New ComparerForTreeView)

    Dim c As New Collections.SortedList(arr.Length)
    Dim rootnode As TreeNode = New TreeNode(arr(LBound(arr)))
    c.Add(rootnode.Text, rootnode)

    For i As Integer = LBound(arr) + 1 To UBound(arr)
      p = arr(i).LastIndexOf("\"c)
      c.Add(arr(i), DirectCast(c(arr(i).Substring(0, p)), TreeNode).Nodes.Add(arr(i).Substring(p + 1)))
    Next

    TreeView1.BeginUpdate()
    TreeView1.Nodes.Add(rootnode)
    TreeView1.EndUpdate()
  End Sub

  Private Class ComparerForTreeView
    Implements IComparer

    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
      Compare = CharCount(DirectCast(x, String), "\"c) - CharCount(DirectCast(y, String), "\"c)

      If Compare = 0 Then Compare = String.Compare(DirectCast(x, String), DirectCast(y, String), True)
    End Function

    Private Shared Function CharCount(ByVal s As String, ByVal c As Char) As Integer
      Dim p, l As Integer

      If s Is Nothing Then Exit Function

      l = Len(s)
      Do
        p = s.IndexOf(c, p)
        If p = -1 Then Exit Function
        CharCount += 1
        If p = l Then Exit Function
        p += 1
      Loop
    End Function
  End Class
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

PUNK-GRUNGER
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 10.06.2004 (Чт) 14:22
Откуда: Украина, Николаев

Сообщение PUNK-GRUNGER » 25.04.2006 (Вт) 14:25

Вот у тебя подпись очень в тему ) Чессн слово.
Большое спасибо.

PUNK-GRUNGER
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 10.06.2004 (Чт) 14:22
Откуда: Украина, Николаев

Сообщение PUNK-GRUNGER » 25.04.2006 (Вт) 15:56

Фуф... GSerg, вот пришел домой, оказывается твой код работает только с корнем...

Вобщем, я решил эту проблему так:
* Взял свою рекурсивную функцию с сервера;
* Сделал обратную ей тоже рекурсивную функцию;

Получилось что-то типа:
Код: Выделить всё

Public Sub RecursPath(ByVal curNode As TreeNode, ByVal sm() As String, ByVal Index As Integer)
        If curNode.Nodes.Find(sm(Index), False).Length = 0 Then
            curNode.Nodes.Add(sm(Index), sm(Index))
        Else
            Call RecursPath(curNode.Nodes.Find(sm(Index), False)(0), sm, Index + 1)
        End If
    End Sub


А вызов такой:
Код: Выделить всё
' Пути
        Dim last As Integer = TreeView1.Nodes.Add("ROOT").Index
        Dim server_dirs() As String = {""} ' Массив с путями (отсортированными, вот тут то компарер твой и понадобился :)
        For Each itm As String In server_dirs
            sm = Split(itm, "\")
            Call RecursPath(TreeView1.Nodes(0), sm, 0)
        Next


Вобщем, вроде работает...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.04.2006 (Вт) 16:13

Поясни мысль о том, что код работает только с корнем, и поясни, как бы ты хотел, чтобы он работал без корня.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

PUNK-GRUNGER
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 10.06.2004 (Чт) 14:22
Откуда: Украина, Николаев

Сообщение PUNK-GRUNGER » 25.04.2006 (Вт) 16:23

Ну скажем, если в строковый массив arr запихивать не

arr(0) = "c:"
arr(1) = "c:\foo"
arr(2) = "c:\bar"
arr(3) = "c:\foo\bar"
arr(4) = "c:\bar\foo"

а вот такие пути:

arr(0) = "foo"
arr(1) = "bar"
arr(2) = "foo\bar"
arr(3) = "bar\foo"

Твой код здесь не работает. Очень жаль, что в TReeView.Nodes нету какого нибудь AddRange для вот таких вот строк. Жизнь была бы легче)) А то второй день уже вас мучаю.

PUNK-GRUNGER
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 145
Зарегистрирован: 10.06.2004 (Чт) 14:22
Откуда: Украина, Николаев

Сообщение PUNK-GRUNGER » 25.04.2006 (Вт) 16:25

Упс. Ошибочка вышла. Все работает. У тебя же там надо "\" перед всем этим ставить. ПРостите )))

Удалите эту тему я вас прошу %) Какой то позор.

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 30.04.2006 (Вс) 5:55

Извините за offtop
А не подскажите ключевые слова для алгоритмов работы с деревьями?
Удачи!
С уважением, Алексадр.


Вернуться в Visual Basic .NET

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

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

    TopList  
cron