DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ツリービューで選ばれたノードをコピーするには?

環境/言語:[VB.NET]
分類:[.NET]

ツリービューで選ばれたノードをコピーするにはどうすれば
いいのでしょうか?

たとえば


動物
|  -----  哺乳類
|            |---- うさぎ
|           |---- いぬ   
|      
 -------  鳥類
            |---- はと
           |---- インコ

こうあるとき

     哺乳類
            |---- うさぎ
           |---- いぬ   

これをコピーして、

動物
|  -----  哺乳類
|            |---- うさぎ
|           |---- いぬ   
|      
 -------  鳥類
            |---- はと
           |---- インコ--- 哺乳類
                              |---- うさぎ
                             |---- いぬ   

この様に貼り付けつける為にはどうしたれいいでしょうか?

色々試したのですが

動物
|  -----  哺乳類
|            |---- うさぎ
|           |---- いぬ   
|      
 -------  鳥類
            |---- はと
           |---- インコ--- 哺乳類
           
この様になってしまって、選択したノードしか移動できず
そのノードの子ノードが移動できません・・・

お願いします。
> ツリービューで選ばれたノードをコピーするにはどうすれば
> いいのでしょうか?

TreeNode.Clone() して、それを Nodes.Add() すれば出来そうですが?

> この様になってしまって、選択したノードしか移動できず
> そのノードの子ノードが移動できません・・・

「どんなコードを書いたらそうなったか」も書くようにしてください。

また、「移動」と「コピー」は異なる操作です。
実現したのはどちらでしょう?
Dim copynode As TreeNode = New TreeNode

            Select Case e.Button.Tag

                 Case "nodecopy"

                    Dim node1 As TreeNode = TreeView1.SelectedNode.Clone

                    copynode = node1


                Case "nodepaste"

                  node1.Nodes.Add(copynode)

この様にしたのですが・・・・

どこが、問題なのでしょう?
もっと詳しく書きますね。


 Dim copynode As TreeNode = New TreeNode

            Select Case e.Button.Tag


                Case "nodetuikaue"

                    If IsNothing(TreeView1.SelectedNode) Then
                        MsgBox("ノードは選択されていません。")

                    Else

                        Dim node1 As TreeNode = TreeView1.SelectedNode
                        Dim a As Integer = node1.Index

                        If node1.Parent Is Nothing Then Exit Sub

                        gazou_cnt += 1
                        node1.Parent.Nodes.Insert(a, New TreeNode("新規" & gazou_cnt))
                       
                    End If

                Case "nodetuikasita"

                    If IsNothing(TreeView1.SelectedNode) Then
                        MsgBox("ノードは選択されていません。")

                    Else

                        Dim node1 As TreeNode = TreeView1.SelectedNode
                        Dim a As Integer = node1.Index
                        
                        If node1.Parent Is Nothing Then Exit Sub

                        gazou_cnt += 1
                        node1.Parent.Nodes.Insert(a + 1, New TreeNode("新規" & gazou_cnt))

                    End If

                Case "nodetuikako"

                    If IsNothing(TreeView1.SelectedNode) Then
                        MsgBox("ノードは選択されていません。")
                    Else
                        gazou_cnt += 1
                        TreeView1.SelectedNode.Nodes.Add("新規" & gazou_cnt)
                        TreeView1.SelectedNode.Expand()

                    End If


                Case "nodemae"

                Case "nodeusiro"

                Case "nodesita"

                Case "nodeue"

                Case "nodecopy"

                    Dim node1 As TreeNode = TreeView1.SelectedNode.Clone()

                    copynode = node1

                Case "nodecut"





                Case "nodepaste"

                    If IsNothing(TreeView1.SelectedNode) Then
                        MsgBox("ノードは選択されていません。")

                    Else

                        Dim node2 As TreeNode = TreeView1.SelectedNode
                        node2.Nodes.Add(copynode)

                    End If

                Case "nodesakujo"

            End Select
Dim node1 As TreeNode = New TreeNode

node1 = TreeView1.SelectedNode.Clone()


ここの部分が問題のようです・・・

どなたか、教えてもらえないでしょうか?
■No17826に返信(???さんの記事)
> ここの部分が問題のようです・・・

じゃなくて、インスタンスが何たるかわかっていないのが根本的な問題だと思います。

> Dim node1 As TreeNode = New TreeNode
> node1 = TreeView1.SelectedNode.Clone()

Cloneでインスタンスが返されるのに・・・

それとその名前は微妙です。
http://dobon.net/vb/bbs/index.html
再帰処理をおこなわなくてはなりません。
TreeNode.Nodesは子供たち(TreeNodeのコレクション)
そしてそれぞれの
子TreeNode.Nodesも子供たち(TreeNodeのコレクション)
と存在するすべてに対して処理をおこなうということです。
http://msdn2.microsoft.com/ja-JP/library/wwc698z7.aspx
「再帰 treeview」なども検索してみてください。


> Dim copynode As TreeNode = New TreeNode
>
> Case "nodecopy"
>
> Dim node1 As TreeNode = TreeView1.SelectedNode.Clone()
>
> copynode = node1

最初のNewですが、ここで新しいTreeNodeが作成されます。
その必要はありますか?
copynode = node1でその新しいTreeNodeは無くなります。

copynode = node1により保存していますが、copynodeはどこに宣言されているのでしょう?
書かれたすべてが1つのプロシージャなら抜けたときに無くなります。

Cloneはどこに追加するかが決まったときに追加する直前でCloneを取得すればよいです。
つまり、処理の元となるオリジナルのTreeNodeを覚えておけばよいでしょう。
書かれた処理はアクションごとに(コピー、貼り付け)呼ばれると思いますので
その外側にPrivate変数を作っておけばよいと思います。
MSDBライブラリのTreeNode.Cloneの項目を読む限り、再帰の処理は特別にはいらないみたいですよ。
手元のVB2005では大丈夫でした。

オブジェクトのスコープの問題っぽいですけど、となるとなんで"哺乳類"がコピーできてるのか、不思議。
> MSDBライブラリのTreeNode.Cloneの項目を読む限り、再帰の処理は特別にはいらないみたいですよ。

すいません。
おおぼけかましてました。m(_ _)m
ありがとう!
問題は解決しました。

どこが問題だったかと言いますと、やはりインスタンスでした。

Dim copynode As TreeNode = New TreeNode この部分です。

ツールバーにボタンを配置しているため、そのボタンを押すたびに
ツールバーを、クリックしたことになり、そのつど

Dim copynode As TreeNode = New TreeNode が、宣言されてしまうことでした。

この変数 copynode を、モジュール変数にすることで、解決しました。

ありがとう!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板