C#なら簡単 TreeViewへの項目の追加・削除・移動 ドラッグアンドドロップにも対応で作成したサンプルプログラムをみて物足りなく思いませんか? 項目にアイコンがありません。そこで今回は追加された項目にアイコンをつけ、自由に変更できるようにします。

まずデザイナで以下のようなものをつくります。

前回と同じですが、赤枠の部分を追加しました。0~7のLabelが付いているのはPictureBoxです。これはTreeViewのアイテムにアイコンをつけるために必要ではありません。どの番号がどのイメージに対応しているかがわかるようにしているだけです。

その下にボタンがあり、これをクリックすると選択されているアイテムのアイコンが変更されます。アイコンはそのアイテムが選択している場合とそうでない場合について指定します。選択時と非選択時で同じアイコンでよいなら同じものを設定してかまいません。

その下にあるのはNumericUpDownコントロールで0から7までの値が選択できるようにしています。

初期化

TreeView1_ItemDrag、TreeView1_DragOver、TreeView1_DragDropは前回の記事と同じです。

treeView1.ItemHeight = 24;はなくてもよいのですが、アイコンを大きめに描画して選択時と非選択時の状態がわかりやすくなるようにするために記述しています。

アイテムにアイコンをつけるためにはTreeView.ImageListプロパティを設定しなければなりません。またImageListを生成したらそこにイメージを追加しなければアイコンは表示されません。

設定するアイコンは以下を使います。これをリソースに追加しておきます。ImageListにImageを追加することになりますが、アイコンだけでなくPNGファイルなどでもかまいません。

それからアイコンをやや大きめにするので以下のコードも追加します。この処理はやらずにデフォルトの値をそのまま使ってもかまいません。

そのあとNumericUpDownコントロールの最大値と最小値を設定しています。最後に後述するInitPictureBoxesメソッドでPictureBoxにイメージを描画しています。

コンストラクタは以下のようになります。ImageListにImageを追加したあと、TreeView.ImageListプロパティにこれを設定しています。

PictureBoxに設定しようとしているアイコンと番号がわかるようにイメージを表示させるためのものです。PictureBox.SizeMode = PictureBoxSizeMode.Zoom とすることでPictureBoxとイメージのサイズが違っていてもうまく表示させることができます。

アイコンの変更

次にアイテムを追加する処理ですが、これも前回の記事と同じです。CreateRootNodeメソッドとイベントハンドラButtonAddItemAsFirst_Click、ButtonAddItemAsLast_Click、ButtonAddItemAsPrev_Click、ButtonAddItemAsNext_Clickは同じです。

アイテムを追加するメソッドのなかに new TreeNode(“初期のアイテムの名前”);と書かれている場合はアイコンは自動的に0番が使われます。それ以外のアイコンを初期状態で設定したい場合は、new TreeNode(“初期のアイテムの名前”, 1, 2);のようにします。最初の数字が非選択時のアイコン、そのあとの数字が選択時のアイコンです。

TreeNode.ImageIndexとTreeNode.SelectedImageIndexでアイコンを変更する

[選択されてるアイテムのアイコンを変更する]ボタンがクリックされたときの処理を示します。NumericUpDownコントロールの値を調べてアイテムが選択されているときとそうでないときのアイコンを設定します。

TreeNode.ImageKeyとTreeNode.SelectedImageKeyを使う方法

TreeNode.ImageIndexとTreeNode.SelectedImageIndexではなく、TreeNode.ImageKeyとTreeNode.SelectedImageKeyを使う方法もあります。その場合は以下のようにします。

ImageListにイメージを追加する場合、Addに引数を1つ渡すものと2つ渡すものを混在させることはできますが、混乱のもとになるのでやめたほうがよいでしょう。