2017-03-15 4 views
0

Je suis en quelque sorte coincé et je ne peux pas voir la forêt pour les arbres.Utilisez la classe TreeNode pour travailler avec des données hiérarchiquement structurées sans TreeView

Ce que je veux faire: J'ai une grande liste de données (environ 6000 nœuds), au moment assez simple:

  • ID unique
  • Parent
  • Liste des enfants
  • Liste item

Actuellement, ce sont données à plat, mais Je veux créer une hiérarchie, donc je peux

  • recherche UniqueID dans une profondeur spécifique de l'arbre
  • pour toute ID, liste rangée des parents jusqu'à la racine
  • liste tous les enfants de un seul ID
  • boucle
  • à travers les entrées (vertical, horizontal)
  • ordre des éléments horizontaux
  • Liste des articles

Ce que j'ai essayé: J'ai commencé avec ce code: see link

<Serializable> _ 
Public Class TreeNode 
    Private _uniqueID As Integer 
    Private _name As String 
    Private _parentID As Integer 
    Private _depth As Integer 
    Private _children As ArrayList 
    Public Sub New() 
    End Sub 
    Public Sub New(name As String, parentID As Integer) 
     Me.New(0, name, parentID, -1) 
    End Sub 
    Public Sub New(uniqueID As Integer, name As String, parentID As Integer, depth As Integer) 
     _uniqueID = uniqueID 
     _name = name 
     _parentID = parentID 
     _depth = depth 
    End Sub 
    ''' <summary> 
    ''' Gets or sets the unique ID associated with this category 
    ''' </summary> 
    ''' <remarks>Once a non-zero ID has been set, it may not be modified.</remarks> 
    Public Property UniqueID() As Integer 
     Get 
      Return _uniqueID 
     End Get 
     Set 
      If _uniqueID = 0 Then 
       _uniqueID = value 
      Else 
       Throw New Exception("The UniqueID property cannot be modified once it has a non-zero value") 
      End If 
     End Set 
    End Property 
    Public ReadOnly Property Depth() As Integer 
     Get 
      Return _depth 
     End Get 
    End Property 
    ''' <summary> 
    ''' Gets or sets the label for this node 
    ''' </summary> 
    Public Property Name() As String 
     Get 
      Return _name 
     End Get 
     Set 
      _name = value 
     End Set 
    End Property 
    ''' <summary> 
    ''' The ID of the parent node 
    ''' </summary> 
    Public Property ParentID() As Integer 
     Get 
      Return _parentID 
     End Get 
     Set 
      _parentID = value 
     End Set 
    End Property 
    ''' <summary> 
    ''' Gets the children TreeNode objects for this category 
    ''' </summary> 
    ''' <remarks>In .NET 2.0, this can be modified to use generics, and have type ArrayList&lt;TreeNode></remarks> 
    Public Property Children() As ArrayList 
     Get 
      Return _children 
     End Get 
     Set 
      _children = value 
     End Set 
    End Property 
End Class 

J'ai créé mon arbre:

Public Dendrogram As List(Of TreeNode) 

.. et ajouté tous les nœuds à elle. Super propre, compréhensible, mais pas de fonctions!

Cela m'a amené à another approach Mais c'est beaucoup trop complexe pour mes objectifs.

.. alors je me demandais: pourquoi ne pas utiliser la classe TreeNode de MS? Mais je ne veux pas utiliser le TreeView associé. Il y a this par exemple, mais il est en C et je n'arrive pas à l'appliquer en VBNet (coincé à l'implémentation du ITreeNode).

Ma question: Comment puis-je utiliser les fonctionnalités de TreeView telles que "TreeView1.Nodes.Add (topNode)" ou "treeView1.Nodes (0) .Nodes.Find (searchterm, True)" sans réellement l'avoir sur mon formulaire (j'en ai juste besoin pour structurer mes données, sans le visualiser). J'espère que cela a du sens et que n'importe qui peut me diriger dans la bonne direction!

Répondre

1

Bien que TreeNode est dans l'espace de noms System.Windows.Forms, il ne semble pas être quelque chose dans ce qui est vraiment lié à WinForms (il semble déjà être héritée dans deux autres espaces de noms) alors, en supposant qu'il vous donne la fonctionnalité vous avez besoin, ne pouvez-vous pas simplement l'utiliser? par exemple.

Imports System.Windows.Forms 

Sub Main 
    Dim root = New TreeNode("Root") 
    root.Nodes.Add("Node 1") 
    root.Nodes.Add("Node 2") 
    root.Nodes.Add("Node 3") 
    root.Nodes(0).Nodes.Add("Node 1.1") 
    root.Nodes(0).Nodes(0).Nodes.Add("Node 1.1.1") 
    root.Nodes(1).Nodes.Add("Node 2.1") 
    PrintNode(root, 0) 
End Sub 

' Define other methods and classes here 
Sub PrintNode(node As TreeNode, level As Integer) 
    Console.WriteLine("{0}{1}", New String(" ", level * 2), node.Text) 
    For Each child In node.Nodes 
     PrintNode(child, level + 1) 
    Next 
End Sub 

Sortie:

Root 
    Node 1 
    Node 1.1 
     Node 1.1.1 
    Node 2 
    Node 2.1 
    Node 3 
+0

Ce absolument travaillé, Mark! Merci pour votre réponse détaillée, et de nombreuses excuses pour ma réponse tardive! – Alex