- 日時: 2011/03/23 10:59
- 名前: 花ちゃん
- ***********************************************************************************
* カテゴリー:[ツリービュー][][] * * キーワード:ノード,TreeView1.Nodes,階層構造,インデックス順,ループ処理, * *********************************************************************************** タイトル : TreeViewのノードの保存 記 事 No : 14888 投 稿 日 : 2010/09/02(Thu) 10:07 元質問者 : ima
ノード全体(階層構造)を、画面に表示されている順で保存したいのです。 しかし、下記のコードでは、各ノード作成時のインデックス順?にリストアップされるためか、 ノードの位置を上下に移動させた状況が反映されません。 For Each nod In TreeView1.Nodes Debug.Print nod.Text Next ----------------------------------------------------------------------------------- 記事No : 14889 投稿日 : 2010/09/02(Thu) 12:11 回答者 : 魔界の仮面弁士 ----------------------------------------------------------------------------------- 詳しくは、記事No:14888 〜 の一連の投稿をご覧ください。
For Each で列挙するのではなく、各ノードの親子兄弟関係を元に Loop 処理しましょう。 基本的には、Next と Child を再起処理すれば列挙できるはずです。
Root プロパティ:最上位ノードを返す(最上位が複数いる場合はその中の長兄) Parent プロパティ: 親ノードを返す(自身が最上位ノードの場合は Nothing) Previous プロパティ: 兄者ノードを返す(自身が長兄の場合は Nothing) Next プロパティ: 弟者ノードを返す(自身が末弟の場合は Nothing) FirstSibling プロパティ: 長兄ノードを返す(自身が長兄の場合は自ノード) LastSibling プロパティ: 末弟ノードを返す(自身が末弟の場合は自ノード) Child プロパティ: 長子ノードを返す(子が居ない場合は Nothing)
なお Root プロパティだけは、自身の階層位置とは無関係です。
Option Explicit
Private Sub Form_Load() List1.Font.Name = "MS ゴシック" List1.Font.Size = 12 Dim d As Collection Set d = New Collection d.Add TreeView1.Nodes.Add(Key:="N1", Text:="N1"), "N1" d.Add TreeView1.Nodes.Add(Key:="N2", Text:="N2"), "N2" d.Add TreeView1.Nodes.Add(Key:="N3", Text:="N3"), "N3" d.Add TreeView1.Nodes.Add(Key:="N4", Text:="N4"), "N4" d.Add TreeView1.Nodes.Add(Key:="N1-1", Text:="N1-1"), "N1-1" d.Add TreeView1.Nodes.Add(Key:="N1-2", Text:="N1-2"), "N1-2" d.Add TreeView1.Nodes.Add(Key:="N1-3", Text:="N1-3"), "N1-3" d.Add TreeView1.Nodes.Add(Key:="N1-4", Text:="N1-4"), "N1-4" d.Add TreeView1.Nodes.Add(Key:="N3-1", Text:="N3-1"), "N3-1" d.Add TreeView1.Nodes.Add(Key:="N1-2-1", Text:="N1-2-1"), "N1-2-1" d.Add TreeView1.Nodes.Add(Key:="N1-2-2", Text:="N1-2-2"), "N1-2-2" d.Add TreeView1.Nodes.Add(Key:="N1-4-1", Text:="N1-4-1"), "N1-4-1" Set d("N1-4").Parent = d("N1") Set d("N1-3").Parent = d("N1") Set d("N1-2").Parent = d("N1") Set d("N1-1").Parent = d("N1") Set d("N3-1").Parent = d("N3") Set d("N1-2-2").Parent = d("N1-2") Set d("N1-2-1").Parent = d("N1-2") Set d("N1-4-1").Parent = d("N1-4") TreeView1_NodeClick d(1) End Sub
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) List1.Clear If Node Is Nothing Then Exit Sub List1.AddItem " Root - " & GetText(Node.Root) List1.AddItem " Parent - " & GetText(Node.Parent) List1.AddItem " Previous - " & GetText(Node.Previous) List1.AddItem " Next - " & GetText(Node.Next) List1.AddItem "FirstSibling - " & GetText(Node.FirstSibling) List1.AddItem " LastSibling - " & GetText(Node.LastSibling) List1.AddItem " Child - " & GetText(Node.Child) End Sub
Function GetText(ByVal n As Node) As String If n Is Nothing Then GetText = "(nothing)" Else GetText = n.Key End If End Function
Sub DumpNextNode(ByVal target As Node, ByVal level As Integer) If target Is Nothing Then Exit Sub Else Debug.Print Tab(level); target.Key End If DumpNextNode target.Child, level + 1 DumpNextNode target.Next, level End Sub
Private Sub Command1_Click() If TreeView1.Nodes.Count = 0 Then Exit Sub Else Debug.Print "----" DumpNextNode TreeView1.Nodes(1).Root, 1 End If End Sub
|