tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^7: TreeViewのツリー構造固定
投稿日: 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 かと。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。