サイトアイコン たまプラ通信

【プログラミング】【ASP.NET】TreeViewコントロールのFindNodeメソッドの使いこなし

ASP.NETのサーバコントロールにTreeViewがありますが、それのFindNodeメソッドの使い方に関するメモです。

FindNodeメソッドは、TreeViewコントロールの中から特定のノードを探し出すのに便利ですが、MSDNで該当する説明を見ても、なかなか使い方がピンときませんでした。まず、FindNodeメソッドには、引数(String型)として値パスを与えるとありますが、値パスとはどのような形式であるのかわかりませんでした。

MSDNでは、こんな風に書かれています。

FindNode メソッドを使用して、指定された値パスにある TreeView コントロールからノードを取得します。 値パスには、ルート ノードから現在のノードまでのパスを構成するノードの値のコンマ区切りのリストが格納されます。 各ノードの ValuePath プロパティには、ノードの値パスが格納されます。 PathSeparator プロパティは、ノードの値を区切るための区切り文字を指定します。

値パスはノード値のコンマ区切りのリスト?わかりました、コンマ区切りね。じゃ、こんな感じで指定すればいいんでしょうか。

ノード1,ノード2,ノード3

でもやってみると、この方法では絶対にFindNodeは失敗するんですね。

ここには、TreeNodeオブジェクトのNodePathプロパティと、PathSeparatorプロパティについて言及されているので、それぞれのマニュアルをMSDNで見てみましょう。

ValuePath プロパティには、ルート ノードから現在のノードまでのパスを構成するノードの値のコンマ区切りのリストが格納されます。 ノードの値を区切るための区切り文字を指定するには、PathSeparator プロパティを使用します。 通常この値は、個々の値についてリストを解析する場合や、TreeView クラスの FindNode メソッドに引数として渡す場合に使用されます。

ここもコンマ区切りと書いてあります。さらに、PathSeparatorプロパティで区切り文字を指定する、とあります。

ValuePath プロパティで指定されたノード値を区切るために使用される文字。 既定値はスラッシュ (/) です。

既定値はスラッシュですか、コンマじゃないじゃん!特にPathSeparatorプロパティを変更しない場合、値パスはこんなふうになるんですね。

ノード1/ノード2/ノード3

どうやらこれで正解です。実際にTreeViewを作成し、FindNodeを実行すれば、パスが存在すればそのノードのTreeNodeオブジェクトが返ります。持つからなければ、NULLが返ります。

もう一つ注意。値パスは、その途中の経路を含めてユニークでなければなりません。

ノード1/ノード2/ノード3
ノード1/ノード2/ノード4

たとえノード4へのパスがあっても、ノード3へのパスと、ノード1/ノード2の部分が重複するので、ノード4は絶対にヒットしません。そういえば、NodeValueプロパティの説明に、こんなのがありました。

同じレベルにあるノードは、それぞれの Value プロパティの値が一意であることが必要です。同一レベルの複数のノードでこの値が同じであると、TreeView コントロールは各ノードを区別できません。 この場合、重複した値を持つノードをユーザーがクリックすると、最初に TreeView コントロールに表示されているノードが選択されます。

ということで、FindNodeの基本的な使い方を書いてみました。それにしても、MSDNの説明も、もう少しわかりやすくして欲しいですね。サンプルも、もっとシンプルなものにして欲しいです。

モバイルバージョンを終了