| | タイトル | : Re^7: TreeViewのツリー構造固定 |  | 記事No | : 8978 |  | 投稿日 | : 2009/05/18(Mon) 13:31 |  | 投稿者 | : 魔界の仮面弁士 | 
 >>  N = TreeView1.Nodes(1)> は考えましたが、それはカウントなので、
 カウントというか、位置ですね。
 そのノードの位置を同階層内の先頭に移動させた場合、TreeNode.Index は 0 になります。
 
 ┣Node1       … TreeView1.Nodes(0)
 ┃┣Node4     … TreeView1.Nodes(0).Nodes(0)
 ┃┃┣Node10  … TreeView1.Nodes(0).Nodes(0).Nodes(0)
 ┃┃┗Node11  … TreeView1.Nodes(0).Nodes(0).Nodes(1)
 ┃┗Node5     … TreeView1.Nodes(0).Nodes(1)
 ┃ ┣Node12  … TreeView1.Nodes(0).Nodes(1).Nodes(0)
 ┃ ┗Node13  … TreeView1.Nodes(0).Nodes(1).Nodes(1)
 ┣Node2       … TreeView1.Nodes(1).Nodes(0)
 ┃┣Node6     … TreeView1.Nodes(1).Nodes(0).Nodes(0)
 ┃┗Node7     … TreeView1.Nodes(1).Nodes(0)
 ┗Node3       … TreeView1.Nodes(2)
 ┣Node8     … TreeView1.Nodes(2).Nodes(0)
 ┃┣Node14  … TreeView1.Nodes(2).Nodes(0).Nodes(0)
 ┃┗Node15  … TreeView1.Nodes(2).Nodes(0).Nodes(1)
 ┗Node9     … TreeView1.Nodes(2).Nodes(1)
 ┗Node16  … TreeView1.Nodes(2).Nodes(1).Nodes(0)
 
 
 > 指定しづらい
 アプリが求める仕様、プログラムの実装によって、「指定しやすい」記述法は異なります。
 
 たとえばファイルパスのように、キーとなる情報がそれぞれのノードにあるのか、
 それともノードを「位置」のみで管理しているのかなど、作成したいプログラムごとの
 管理方法によって適切なコードは異なりますので、先の発言では
 >> 指定方法は幾通りもあります。
 という発言に留めています。
 
 
 >> また、下位の層まで辿って探したい、あるいは同名ノードが複数ある場合には、
 >>  Ns = TreeView1.Nodes.Find("XXX2", True)
 > もしかして、変数の事ですか?
 変数の名前というか、ノードの名前の事です。具体的には、TreeNode.Name プロパティ。
 TreeView1.Nodes.Add("Key1", "Text1") とした時の Key1 の部分という言い方もできますね。
 
 
 > Dim XXX123 As TreeNode = New TreeNode("XXX123")で、N = TreeView1.Nodes.Find(New TreeNode() {XXX123})ですよね?
 違います。…というか、それだと Find メソッド部はコンパイルすら通りませんよね。
 
 第一、変数『XXX123』を保持しているなら、それをそのまま指定時に使えば良いだけで、
 検索して変数『N』に入れなおす必要はないかと思いますよ。
 検索しなおしたところで、変数 N と 変数 XXX123 は同じ物を指し示す事になるだけかと。
 
 > > あるいは、ノード名ではなく、表示名(Textプロパティ)から探したいのであれば、
 > > Nodes プロパティを再帰的に列挙してやれば良いかと。
 > そうですか?Textプロパティから探す方法があるとは知りませんでした。
 そのためのメソッドがあるわけでは無いのですが、特別な方法というわけでもありません。
 単純に、各ノードを再帰的に列挙しながら、TreeNode.Text を見ていくだけですよ。
 
 Function FindSingleNodeByText(ByVal nodes As TreeNodeCollection, ByVal text As String) As TreeNode
 For Each node As TreeNode In nodes
 If node.Text = text Then Return node
 Dim N As TreeNode = FindSingleNodeByText(node.Nodes, text)
 If N IsNot Nothing Then Return N
 Next
 Return Nothing
 End Function
 
 # 該当する複数のノードを返したい場合は、配列として返した方が良いかも。
 
 
 > 同じTextがあるので、使い避けたいかも?
 どのようにしてツリーを管理したいのかわからないので、明言は出来ませんが、
 TreeNode.Name や TreeNode.Index や TreeNode.Text 等でも特定できないなら、
 追加情報となるプロパティを、TreeNode に追加してやれば OK かと。
 
 |