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の説明も、もう少しわかりやすくして欲しいですね。サンプルも、もっとシンプルなものにして欲しいです。