ノードの登録


TreeViewコントロールにツリー形式で表示される各データのことを「ノード」(Node)と呼びます。ノードを登録するには、NodesコレクションのAddメソッドを使います。

TreeView.Nodes.Add [Relative], [Relationship], [Key], [Text], [Image], [SelectedImage]

引数Relativeには、Addメソッドで登録するノードが「どの親」の子供になるかを指定します。たとえば下図のようなツリーでは、「田中」の親は「氏名」になります。また「趣味」と「特技」の親はどちらも「田中」です。

そこで、「田中」「趣味」「特技」の各ノードをAddメソッドで登録する考え方は、次のようになります。

TreeView.Nodes.Add "氏名", [Relationship], [Key], "田中", [Image], [SelectedImage]
TreeView.Nodes.Add "田中", [Relationship], [Key], "趣味", [Image], [SelectedImage]
TreeView.Nodes.Add "田中", [Relationship], [Key], "特技", [Image], [SelectedImage]

また、親を持たない「氏名」と「住所」は、引数Relativeを省略します。

TreeView.Nodes.Add , [Relationship], [Key], "氏名", [Image], [SelectedImage]
TreeView.Nodes.Add , [Relationship], [Key], "住所", [Image], [SelectedImage]

このコードを見てもわかるように、引数Textには表示する文字列を指定します。

注意しなければいけないのは、引数Relativeに指定するのは、引数Textで指定した文字列ではなく、引数Keyで指定する文字列だということです。引数Textはツリー状に表示する文字列ですから、同じ文字が複数登場してもかまいません。しかし、各ノードを個別に管理するには、重複しない名前が必要です。その重複しない名前を指定するのが引数Keyです。引数Relativeには、引数Keyで指定した名前を使います。

まず親を2つ登録しましょう。それぞれの引数Keyに注目してください。

TreeView.Nodes.Add , [Relationship], "_Name", "氏名", [Image], [SelectedImage]
TreeView.Nodes.Add , [Relationship], "_Address", "住所", [Image], [SelectedImage]

引数Keyに「_Name」と下線から始まる文字列を指定したのには、深い意味はありません。「Name」や「Address」はVBAの予約語なので区別したかっただけです。「Namae」「Jyusyo」でもけっこうです。

さて、親ノードのKeyがわかりましたので、子ノードは次のようにして登録します。「田中」と「趣味」「特技」の関係にも注目してください。

TreeView.Nodes.Add "_Name", [Relationship], "tanaka", "田中", [Image], [SelectedImage]
TreeView.Nodes.Add "tanaka", [Relationship], , "趣味", [Image], [SelectedImage]
TreeView.Nodes.Add "tanaka", [Relationship], , "特技", [Image], [SelectedImage]

ここで、「趣味」と「特技」は親になりませんので、引数Keyを省略できます。今後のことを想定して、すべてのノードで引数Keyを指定しておいてもいいですが、注意しなければならないのは、引数Key重複してはいけないということです。Addメソッドで重複したKeyを使うとエラーになります。

子ノードを登録するときに忘れてならないのは、引数Relationshipです。そのノードが子供であることを指示するために、子ノードを登録するときは引数Relationshipに定数tvwChildを指定します。

TreeView.Nodes.Add , , "_Name", "氏名", [Image], [SelectedImage]
TreeView.Nodes.Add , , "_Address", "住所", [Image], [SelectedImage]
TreeView.Nodes.Add "_Name", tvwChild, "tanaka", "田中", [Image], [SelectedImage]
TreeView.Nodes.Add "tanaka", tvwChild, , "趣味", [Image], [SelectedImage]
TreeView.Nodes.Add "tanaka", tvwChild, , "特技", [Image], [SelectedImage]

tvwChildは定数ですから、""(ダブルコーテーション)で囲ってはいけません。

残るは、引数Imageと引数SelectedImageです。引数Imageには、選択されていない状態のアイコンを指定し、引数SelectedImageにはノードが選択されたときに表示するアイコンを指定します。エクスプローラなどで、フォルダのアイコンをクリックすると開いたアイコンに変化しますよね。このとき、開いていないフォルダアイコンが引数Imageで、開いたアイコンが引数SelectedImageです。今回は引数SelectedImageを指定しませんが、指定の方法は引数Imageと同じです。

引数Imageに指定するのは、ImageListコントロールに登録した画像です。画像を登録したとき、それぞれの画像に[キー]ボックスで名前を指定したのを思い出してください。引数Imageに指定するのは、その名前です。ここでは「氏名」「住所」に「book」を、「田中」に「sheet」を指定します。

TreeView.Nodes.Add , , "_Name", "氏名", "book"
TreeView.Nodes.Add , , "_Address", "住所", "book"
TreeView.Nodes.Add "_Name", tvwChild, "tanaka", "田中", "sheet"
TreeView.Nodes.Add "tanaka", tvwChild, , "趣味"
TreeView.Nodes.Add "tanaka", tvwChild, , "特技"

実行したイメージは次の通りです。

注意したいのは、アイコンを指定しなかった「趣味」「特技」には、先頭にアイコン分の余白が挿入されるということです。TreeViewコントロールの初期化で「.ImageList = ImageList1」のようにイメージリストを設定すると、文字の左には必ずアイコンのスペースが発生します。個別に指定することはできませんので注意してください。もっとも、APIを駆使すれば余白を挿入させないでノードごとにアイコンを表示できるかもしれませんが、そこまでする必要はありません。アイコンを表示するなら、すべてのノードにアイコンを表示すればいいでしょう。見栄えにこだわって、枝葉末節に苦労するよりも、安定した美しいコードを書くよう心がけるべきです。

さて、このようにノードを登録するAddメソッドでは多くの引数を指定します。上記は考え方を解説しただけですから、このまま使わず、次のように名前付き引数を利用するといいでしょう。

With TreeView1.Nodes
    .Add Key:="_Name", Text:="氏名", Image:="book"
    .Add Key:="_Address", Text:="住所", Image:="book"
    .Add Relative:="_Name", Relationship:=tvwChild, Key:="tanaka", Text:="田中", Image:="sheet"
    .Add Relative:="tanaka", Relationship:=tvwChild, Text:="趣味"
    .Add Relative:="tanaka", Relationship:=tvwChild, Text:="特技"
End With

上記のコードをコピーして動作確認するときは、先頭行「With TreeView1.Nodes」のコントロール名を正しく指定してください。UserFormに配置したのがTreeView2でしたら「With TreeView2.Nodes」となります。

UserFormにコマンドボタンを1つ追加して、クリックするとノードが追加されるようにするにしてみましょう。

Private Sub CommandButton1_Click()
    With TreeView1.Nodes
        .Add Key:="_Name", Text:="氏名", Image:="book"
        .Add Key:="_Address", Text:="住所", Image:="book"
        .Add Relative:="_Name", Relationship:=tvwChild, Key:="tanaka", Text:="田中", Image:="sheet"
        .Add Relative:="tanaka", Relationship:=tvwChild, Text:="趣味"
        .Add Relative:="tanaka", Relationship:=tvwChild, Text:="特技"
    End With
End Sub