2017-06-19 6 views
0

私は自分のデータセットからツリー構造を構築しました。今私は、TreeViewで、次のコードを使用してその階層を表現しようとしています。なぜ私のツリービューはフラットですか?

まず、すべてのルートノートを作成:階層の各レベルを反復処理し、一度に子供の1つのレベルを追加し、その後

For Each nodeObject In NodeCollection 
    If nodeObject.rank = 0 Then 
     treeUCD.Nodes.Add key:=nodeObject.Name, Text:=nodeObject.Description 
    End If 
Next nodeObject 

For i = 1 To treeHeight 
    For Each nodeObject In NodeCollection 
     If nodeObject.rank = i Then 
      treeUCD.Nodes.Add nodeObject.Parent.Name, tvwChild, _ 
       nodeObject.Name, nodeObject.Description 
     End If 
    Next nodeObject 
Next I 

しかし、すべてのノードが作成されますルートノードとして。子供の割り当て方法は?

EDIT: ノードにランクを割り当てる方法に問題があります。ステップ実行すると、それが適切に増加していることが明らかになったが、私の再帰関数は、0毎回返します

Function GetRank(nodeObject As clsNode, ByRef rank As Integer) 
    If nodeObject.Parent Is Nothing Then 
     GetRank = rank 
     Exit Function 
    End If 
    GetRank nodeObject.Parent, rank + 1 
End Function 

EDIT 反復機能が今働いている:

GetRank = GetRank(nodeObject.Parent, rank + 1) 
をが、TreeViewコントロールはいずれも表示されません子供。

+0

それはTreeNodeCollectionだ - そして、これは正確に 'ないhttps://msdn.microsoft.com/en-us/library/system.windows.forms.treenodecollection(v=vs.110).aspx – thecatswhiskers

+0

vba'関連の質問ですか? – Vityata

+0

@VityataどうやってVBAに関連しないのですか? – Tomalak

答えて

0

解決済み:ツリービューは動作していましたが、ルートノードの隣に+アイコンが表示されません。ダブルクリックして子供を公開する必要があります。

+0

これは、TreeViewコントロールで変更できる設定です。 – Tomalak

0

再帰関数は、Elseケースの値を返しません。

Function GetRank(nodeObject As clsNode, rank As Integer) As Integer 
    If nodeObject.Parent Is Nothing Then 
     GetRank = rank 
    Else 
     GetRank = GetRank(nodeObject.Parent, rank + 1) 
    End If 
End Function 

しかし、実際に私はそれがよりストレートフォワードだが、ここでは非再帰的バリアントを示唆:これは良いです

Function GetRank(nodeObject As clsNode) As Integer 
    While Not nodeObject.Parent Is Nothing 
     GetRank = GetRank + 1 
     Set nodeObject = nodeObject.Parent 
    Wend 
End Function 

あなたのツリー構築にも最適ではありません。繰り返しノードを経由するのではなく、入力ツリーが整理されているのと同じ方法でノードを作成してください。

Sub CreateNodes(tv As TreeView, myNode As clsNode, Optional tvRefNode As node) 
    Dim childNode As clsNode 

    For Each childNode In myNode.Children 
     CreateNodes tv, childNode, tv.nodes.Add(_ 
      Relative:=IIf(tvRefNode Is Nothing, vbNull, tvRefNode.Index), _ 
      Relation:=tvwChild, _ 
      Key:=myNode.Name, _ 
      Text:=myNode.Description _ 
    ) 
    Next childNode 
End Sub 

ここで行う必要があるのは、ルートノードを開始点として渡すことだけです。

CreateNodes myTreeView, myRootNode 
関連する問題