Заполнение TreeView из массива

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

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

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Заполнение TreeView из массива

Сообщение Dmitry81 » 09.11.2009 (Пн) 12:21

Ребят, мучаюсь уже второй день, но никак не могу допереть, как сделать такое:

есть массив из строк:
УзелА\УзелБ\УзелВ
УзелА\УзелБ\УзелС
УзелF\УзелБ

надо из него построить в TreeView дерево, которое будет отображать приведенный выше массив. Условие: на каждом уровне имена узлов уникальны, т.е. по моему примеру будет один узел А, в нем один узел Б и в нем два узла(В и С), далее идет узел А и в нем узел Б...

Строки массива - не элементы файловой системы, просто строки с разделителями в виде "\".
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Заполнение TreeView из массива

Сообщение Alec » 09.11.2009 (Пн) 13:28

как-то так
Код: Выделить всё
Sub sub1()
    'исходные значения
    Dim St() As String = {"УзелА\УзелБ\УзелВ", "УзелА\УзелБ\УзелС", "УзелF\УзелБ"}
    Dim P = "\"

    Dim i As Long
    Dim j As Long
    Dim S() As String
    Dim Nodes As TreeNodeCollection

    For i = 0 To St.Count - 1 'перебираем элементы исходного массива
      S = St(i).Split(P) 'разделяем на массив узлов
      Nodes = TreeView1.Nodes 'начинаем искать с корня дерева
      For j = 0 To S.Count - 1 'перебираем массив узлов
        If Nodes(S(j)) IsNot Nothing Then 'если такой узел есть, то "переходим" в него
          Nodes = Nodes(S(j)).Nodes
        Else ' иначе добавляем и "переходим"
          Nodes = Nodes.Add(S(j), S(j)).Nodes
        End If
      Next
    Next
  End Sub
Иногда лучше вовремя остановиться...
И начать заново!

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Заполнение TreeView из массива

Сообщение Dmitry81 » 09.11.2009 (Пн) 15:09

Спасибо огроменное. Немного порихтовал и под себя наладил: крайние узлы (последние в каждой строке) должны иметь другие картинки и теги.
Код: Выделить всё
Sub FillTree()
        'исходные значения
        Dim i As Integer
        Dim St As String() = {"УзелА\УзелБ\УзелВ", "УзелА\УзелБ\УзелС", "УзелF\УзелБ", "УзелF-\УзелБ-"}
        Dim P = Me.tvwStructure.PathSeparator
        Dim j As Integer
        Dim S() As String
        Dim Nodes As TreeNodeCollection
        Dim node As TreeNode
        For i = 0 To St.Length - 1 'перебираем элементы исходного массива
            S = St(i).Split(P) 'разделяем на массив узлов
            Nodes = Me.tvwStructure.Nodes 'начинаем искать с корня дерева
            For j = 0 To S.Length - 1 'перебираем массив узлов
                Try
                    If Nodes(S(j)) IsNot Nothing Then 'если такой узел есть, то "переходим" в него
                        Nodes = Nodes(S(j)).Nodes
                    Else ' иначе добавляем и "переходим"
                        If j < S.Length - 1 Then
                            node = Nodes.Add(S(j), S(j), "Folder", "Folder open")
                            node.Tag = "Folder"
                            Nodes = node.Nodes
                        Else
                            node = Nodes.Add(S(j), S(j), "Contact", "Contact open")
                            node.Tag = "Kontact"
                            Nodes = node.Nodes
                        End If
                    End If
                Catch ex As Exception
                End Try
            Next
        Next
    End Sub

еще раз сенкс! А то уже чет голова квадратная...
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: Заполнение TreeView из массива

Сообщение 1Steps » 12.11.2009 (Чт) 6:27

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

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim st() As String = New String() {"УзелА\УзелБ\УзелВ", _
                                           "УзелА\УзелБ\УзелС", _
                                           "УзелА\УзелБ\УзелС", _
                                           "УзелА\УзелБ\УзелВ", _
                                           "УзелF\УзелБ\УзелВ"}

        For i As Integer = 0 To st.Length - 1
            Dim s() As String = st(i).Split("\"c)
            Me.AddItemToTreeview(s)
        Next
    End Sub

    Public Sub AddItemToTreeview(ByVal item As String())
        Dim nodes As TreeNodeCollection = TreeView1.Nodes
        For i As Integer = 0 To item.Length - 1
            nodes = If(nodes.Find(item(i), False).Length > 0, _
                       nodes.Find(item(i), False)(0).Nodes, _
                       nodes.Add(item(i), item(i)).Nodes)
        Next
    End Sub
Удалена за ненадобностью.

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Заполнение TreeView из массива

Сообщение Dmitry81 » 12.11.2009 (Чт) 22:11

1Steps, спасибо. Я заценил твой код уже на pirit-e :)
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Заполнение TreeView из массива

Сообщение Nord777 » 13.11.2009 (Пт) 8:27

1Steps, а код Alec'а работает в два раза быстрее... :bball:
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: Заполнение TreeView из массива

Сообщение 1Steps » 13.11.2009 (Пт) 23:57

Nord777 писал(а):1Steps, а код Alec'а работает в два раза быстрее... :bball:

Ну это и ежу понятно. Я подозреваю, в тривью не надо грузить ноды тысячами :mrgreen:
Удалена за ненадобностью.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Заполнение TreeView из массива

Сообщение Nord777 » 14.11.2009 (Сб) 0:37

Я просто не понимаю, что вам обоим мешало написать такой вот простой код, который не только более читаемый, но и более быстрый.
Всё же на поверхности лежит...
Лень посмотреть в Object Browser?
Код: Выделить всё
      Dim nodes As TreeNodeCollection
      For Each S As String In st
         nodes = TreeView1.Nodes
         For Each S1 As String In S.Split("\"c)
            If nodes.ContainsKey(S1) Then
               nodes = nodes(S1).Nodes
            Else
               nodes = nodes.Add(S1, S1).Nodes
            End If
         Next
      Next
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Dmitry81
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 52
Зарегистрирован: 20.06.2009 (Сб) 0:43
Откуда: Украина, Запорожье

Re: Заполнение TreeView из массива

Сообщение Dmitry81 » 14.11.2009 (Сб) 1:04

ну вы даете!
Не думал, что мой вопрос создаст такое оживление...
Спасибо, други!

P.S. Да, действительно, я не собираюсь грузить ноды тысячами :) Думаю, сотни 3 максимум, да и то со временем.
А.Эйнштейн: Есть две бесконечные вещи - вселенная и человеческая глупость. Хотя, насчет вселенной я сомневаюсь...


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

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

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

    TopList