[C#] TreeViewでノードを取得する方法
C#のTreeViewコントロールでノードを取得する方法は、いくつかの手順があります。
まず、特定のノードを取得するには、TreeView.Nodes
コレクションを使用します。
このコレクションは、TreeViewのルートノードを含んでおり、各ノードはさらに子ノードを持つことができます。
ノードを取得するには、インデックスを指定してアクセスするか、ノードのName
プロパティを使用して検索します。
また、SelectedNode
プロパティを使用すると、現在選択されているノードを取得できます。
再帰的にノードを検索する場合は、ループや再帰関数を用いて、各ノードの子ノードを探索する方法もあります。
ノードの取得方法
C#のTreeViewコントロールを使用すると、階層的なデータを表示し、ユーザーがそれを操作できるようになります。
ノードを取得する方法はいくつかあり、ここではインデックス、名前、選択されたノードを使用した取得方法について解説します。
インデックスを使用したノードの取得
TreeViewのノードは、インデックスを使用して簡単に取得できます。
以下のサンプルコードでは、特定のインデックスにあるノードを取得し、そのテキストを表示します。
partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// TreeViewの初期化
TreeView treeView = new TreeView();
treeView.Nodes.Add("ノード1");
treeView.Nodes.Add("ノード2");
treeView.Nodes.Add("ノード3");
// インデックスを使用してノードを取得
TreeNode node = treeView.Nodes[1]; // インデックス1のノードを取得
MessageBox.Show(node.Text); // ノードのテキストを表示
}
}

このコードを実行すると、インデックス1にあるノード(「ノード2」)のテキストが表示されます。
名前を使用したノードの取得
ノードの名前を使用して特定のノードを取得することも可能です。
以下のサンプルコードでは、ノードの名前を指定して取得し、そのテキストを表示します。
partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// TreeViewの初期化
TreeView treeView = new TreeView();
treeView.Nodes.Add("ノード1");
treeView.Nodes.Add("ノード2");
treeView.Nodes.Add("ノード3");
// 名前を使用してノードを取得
TreeNode node = treeView.Nodes["ノード2"]; // 名前「ノード2」のノードを取得
MessageBox.Show(node.Text); // ノードのテキストを表示
}
}
このコードを実行すると、名前「ノード2」に対応するノードのテキストが表示されます。
選択されたノードの取得
ユーザーが選択したノードを取得することもできます。
以下のサンプルコードでは、選択されたノードのテキストを表示します。
partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// TreeViewの初期化
TreeView treeView = new TreeView();
treeView.Nodes.Add("ノード1");
treeView.Nodes.Add("ノード2");
treeView.Nodes.Add("ノード3");
// ノードを選択したときのイベント
treeView.AfterSelect += (sender, e) =>
{
TreeNode selectedNode = treeView.SelectedNode; // 選択されたノードを取得
MessageBox.Show(selectedNode.Text); // ノードのテキストを表示
};
}
}
このコードを実行し、ノードを選択すると、選択されたノードのテキストが表示されます。
再帰的なノード検索
TreeViewコントロール内のノードを再帰的に検索する方法について解説します。
再帰関数を使用することで、階層構造のデータを効率的に探索できます。
以下では、再帰関数の基本、再帰的なノード探索の方法、そして実際の実装例を紹介します。
再帰関数の基本
再帰関数とは、自分自身を呼び出す関数のことです。
再帰を使用することで、複雑な問題をよりシンプルに解決できます。
再帰関数は、以下の2つの要素から成り立っています。
- 基本ケース: 再帰を終了する条件
- 再帰ケース: 自分自身を呼び出す部分
再帰関数を使用する際は、無限ループに陥らないように基本ケースを適切に設定することが重要です。
再帰的にノードを探索する方法
TreeViewのノードを再帰的に探索するには、以下の手順を踏みます。
- 現在のノードをチェックし、条件に合致する場合は処理を行う。
- 子ノードが存在する場合、再帰的にその子ノードを探索する。
- すべてのノードを探索するまでこのプロセスを繰り返す。
この方法を用いることで、階層構造のすべてのノードを効率的に検索できます。
再帰検索の実装例
以下のサンプルコードでは、TreeView内のすべてのノードを再帰的に探索し、特定の条件に合致するノードのテキストを表示します。
partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// TreeViewの初期化
TreeView treeView = new TreeView();
treeView.Nodes.Add("親ノード1");
treeView.Nodes[0].Nodes.Add("子ノード1-1");
treeView.Nodes[0].Nodes.Add("子ノード1-2");
treeView.Nodes.Add("親ノード2");
treeView.Nodes[1].Nodes.Add("子ノード2-1");
// 再帰的にノードを探索する
SearchNodes(treeView.Nodes);
}
private void SearchNodes(TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
{
// 条件に合致するノードの処理
if (node.Text.Contains("子"))
{
MessageBox.Show(node.Text); // 条件に合致するノードのテキストを表示
}
// 子ノードが存在する場合、再帰的に探索
if (node.Nodes.Count > 0)
{
SearchNodes(node.Nodes);
}
}
}
}
このコードを実行すると、「子ノード1-1」、「子ノード1-2」、「子ノード2-1」といった条件に合致するノードのテキストが表示されます。
再帰的な探索により、すべてのノードを効率的に検索できることがわかります。
イベントを利用したノード取得
C#のTreeViewコントロールでは、さまざまなイベントを利用してノードの取得や操作を行うことができます。
ここでは、ノード選択イベント、ノード展開イベント、ノードチェックイベントの活用方法について解説します。
ノード選択イベントの活用
ノード選択イベントは、ユーザーがノードを選択したときに発生します。
このイベントを利用することで、選択されたノードの情報を取得することができます。
以下のサンプルコードでは、ノードが選択されたときにそのテキストを表示します。
partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// TreeViewの初期化
TreeView treeView = new TreeView();
treeView.Nodes.Add("ノード1");
treeView.Nodes.Add("ノード2");
treeView.Nodes.Add("ノード3");
// ノード選択イベントの設定
treeView.AfterSelect += (sender, e) =>
{
TreeNode selectedNode = treeView.SelectedNode; // 選択されたノードを取得
MessageBox.Show(selectedNode.Text); // ノードのテキストを表示
};
}
}
このコードを実行し、ノードを選択すると、選択されたノードのテキストが表示されます。
ノード展開イベントの活用
ノード展開イベントは、ユーザーがノードを展開したときに発生します。
このイベントを利用することで、展開されたノードの情報を取得したり、特定の処理を行ったりすることができます。
以下のサンプルコードでは、ノードが展開されたときにそのノードのテキストを表示します。
partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// TreeViewの初期化
TreeView treeView = new TreeView();
treeView.Nodes.Add("親ノード1");
treeView.Nodes[0].Nodes.Add("子ノード1-1");
treeView.Nodes[0].Nodes.Add("子ノード1-2");
// ノード展開イベントの設定
treeView.AfterExpand += (sender, e) =>
{
TreeNode expandedNode = e.Node; // 展開されたノードを取得
MessageBox.Show(expandedNode.Text); // ノードのテキストを表示
};
}
}
このコードを実行し、親ノードを展開すると、その親ノードのテキストが表示されます。
ノードチェックイベントの活用
ノードチェックイベントは、ユーザーがノードのチェックボックスを操作したときに発生します。
このイベントを利用することで、チェックされたノードの情報を取得したり、特定の処理を行ったりすることができます。
以下のサンプルコードでは、ノードがチェックされたときにそのノードのテキストを表示します。
partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// TreeViewの初期化
TreeView treeView = new TreeView();
treeView.CheckBoxes = true; // チェックボックスを有効にする
treeView.Nodes.Add("ノード1");
treeView.Nodes.Add("ノード2");
treeView.Nodes.Add("ノード3");
// ノードチェックイベントの設定
treeView.AfterCheck += (sender, e) =>
{
TreeNode checkedNode = e.Node; // チェックされたノードを取得
MessageBox.Show(checkedNode.Text + " が " + (checkedNode.Checked ? "チェックされました" : "チェックが外されました")); // ノードのテキストを表示
};
}
}
このコードを実行し、ノードのチェックボックスを操作すると、チェックされたノードのテキストが表示されます。
これにより、ユーザーの操作に応じた動的な処理が可能になります。
応用例
C#のTreeViewコントロールは、さまざまな応用が可能です。
ここでは、ノードのドラッグアンドドロップ、動的な追加と削除、カスタム描画の3つの応用例について解説します。
ノードのドラッグアンドドロップ
TreeViewでは、ノードをドラッグアンドドロップすることで、ユーザーがノードの順序を変更したり、親子関係を変更したりすることができます。
以下のサンプルコードでは、ノードのドラッグアンドドロップを実装しています。
using System.Drawing;
using System.Windows.Forms;
partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// TreeViewの初期化
TreeView treeView = new TreeView();
treeView.Nodes.Add("ノード1");
treeView.Nodes.Add("ノード2");
treeView.Nodes.Add("ノード3");
// ドラッグアンドドロップの設定
treeView.AllowDrop = true; // AllowDropを有効にする
treeView.ItemDrag += (sender, e) =>
{
DoDragDrop(e.Item, DragDropEffects.Move); // ドラッグを開始
};
treeView.DragEnter += (sender, e) =>
{
if (e.Data.GetDataPresent(typeof(TreeNode)))
{
e.Effect = DragDropEffects.Move; // ドラッグ中の効果を設定
}
else
{
e.Effect = DragDropEffects.None; // ドラッグできない場合
}
};
treeView.DragOver += (sender, e) =>
{
if (e.Data.GetDataPresent(typeof(TreeNode)))
{
// マウスの位置に基づいてターゲットノードを取得
TreeView tree = (TreeView)sender;
Point targetPoint = tree.PointToClient(new Point(e.X, e.Y));
TreeNode targetNode = tree.GetNodeAt(targetPoint);
// ドラッグ中に移動可能であればMove効果を表示
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
};
treeView.DragDrop += (sender, e) =>
{
// ドロップされた位置を取得
TreeView tree = (TreeView)sender;
Point targetPoint = tree.PointToClient(new Point(e.X, e.Y));
TreeNode targetNode = tree.GetNodeAt(targetPoint); // ドロップ先のノード
TreeNode draggedNode = (TreeNode)e.Data.GetData(typeof(TreeNode)); // ドラッグされたノード
if (draggedNode != null && targetNode != null && draggedNode != targetNode)
{
// ドロップ先にドラッグされたノードを追加
TreeNode newNode = (TreeNode)draggedNode.Clone();
targetNode.Nodes.Add(newNode);
// 必要に応じて展開
targetNode.Expand();
// 元のノードを削除
draggedNode.Remove();
}
};
// フォームにTreeViewを追加
this.Controls.Add(treeView);
}
}
このコードを実行すると、ノードをドラッグして別のノードの下にドロップすることで、ノードの親子関係を変更できます。
ノードの動的な追加と削除
TreeViewでは、ユーザーの操作に応じてノードを動的に追加したり削除したりすることができます。
以下のサンプルコードでは、ボタンをクリックすることでノードを追加し、選択されたノードを削除する機能を実装しています。
partial class MyForm : Form
{
private TreeView treeView;
public MyForm()
{
InitializeComponent();
// TreeViewの初期化
treeView = new TreeView();
treeView.Nodes.Add("ノード1");
treeView.Nodes.Add("ノード2");
// ノード追加ボタン
Button addButton = new Button { Text = "ノード追加" };
addButton.Click += (sender, e) =>
{
treeView.Nodes.Add("新しいノード"); // 新しいノードを追加
};
// ノード削除ボタン
Button removeButton = new Button { Text = "ノード削除" };
removeButton.Click += (sender, e) =>
{
if (treeView.SelectedNode != null)
{
treeView.Nodes.Remove(treeView.SelectedNode); // 選択されたノードを削除
}
};
// フォームにコントロールを追加
Controls.Add(treeView);
Controls.Add(addButton);
Controls.Add(removeButton);
}
}
このコードを実行すると、「ノード追加」ボタンをクリックすることで新しいノードが追加され、「ノード削除」ボタンをクリックすることで選択されたノードが削除されます。
ノードのカスタム描画
TreeViewでは、ノードの描画をカスタマイズすることも可能です。
以下のサンプルコードでは、ノードのテキストの色を変更するカスタム描画を実装しています。
partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
// TreeViewの初期化
TreeView treeView = new TreeView();
treeView.Nodes.Add("ノード1");
treeView.Nodes.Add("ノード2");
// ノードのカスタム描画
treeView.DrawMode = TreeViewDrawMode.OwnerDrawAll; // カスタム描画を有効にする
treeView.DrawNode += (sender, e) =>
{
if (e.Node.Text.Contains("1"))
{
e.Graphics.FillRectangle(Brushes.LightBlue, e.Bounds); // 背景色を設定
e.Graphics.DrawString(e.Node.Text, e.Node.NodeFont ?? treeView.Font, Brushes.Black, e.Bounds); // テキストを描画
}
else
{
e.DrawDefault = true; // デフォルトの描画を使用
}
};
}
}
このコードを実行すると、「ノード1」の背景色がライトブルーに変更され、カスタム描画が適用されます。

ノードの描画をカスタマイズすることで、ユーザーインターフェースをより魅力的にすることができます。
まとめ
この記事では、C#のTreeViewコントロールを使用したノードの取得方法や、再帰的なノード検索、イベントを利用したノード取得のテクニックについて詳しく解説しました。
また、ノードのドラッグアンドドロップや動的な追加・削除、カスタム描画といった応用例も紹介しました。
これらの知識を活用することで、よりインタラクティブで使いやすいアプリケーションを作成することが可能です。
ぜひ、実際のプロジェクトに取り入れて、TreeViewの機能を最大限に活用してみてください。