- PR -

TreeViewオブジェクトのコピー方法(C#)

投稿者投稿内容
alf
常連さん
会議室デビュー日: 2005/11/15
投稿数: 22
お住まい・勤務地: 岐阜県・愛知県
投稿日時: 2006-08-02 08:36

 いつも参考にさせて頂いています。

 XMLファイルの内容をフォーム上に張りつけたTreeViewオブジェクトに関連付けて
 表示させることは出来ましたが、この状態で別のTreeViewオブジェクトにこのTreeView
 オブジェクトをコピーするにはどうしたらいいでしょうか?
 (単純にオブジェクトを=代入しただけではダメでした)
 また、フォーム上に張りつけずにnewで生成したTreeViewをフォーム上に張りつけた
 TreeViewにコピーすることは可能でしょうか?

 つまり、やりたい事は

)フォーム上に張りつけたTreeViewオブジェクトにXMLファイルを関連付け
     ↓
 フォーム上に張りつけた別のTreeViewオブジェクトに上記TreeViewオブジェクトをコピー

)new生成したTreeViewオブジェクトにXMLファイルを関連付け
     ↓
 フォーム上に張りつけた別のTreeViewオブジェクトに上記TreeViewオブジェクトをコピー

 の2点です。


 本来の目的は)なのですが)が出来れば)も可能だと思い、色んなコピー関数を試
 してみましたが上手く行きませんでした。

 何卒よろしくお願いします。


[開発環境] .NET2003 + C#
会議室デビュー日: 2006/07/12
投稿数: 5
投稿日時: 2006-08-02 09:40
はじめまして。お世話になります。

やりたいこと:
「TreeView1に表示されているノードを、TreeView2にコピーしたい。」
ということでよろしいでしょうか?

それだとこんな感じでできます。

object node = treeView1.TopNode.Clone();
treeView2.Nodes.Add((TreeNode)node);

TreeView1のTopNodeからノードのクローンを作成し、TreeView2のNodeとして追加しています。
クローンを作成しない場合は、TreeView1からNodeを削除しないとコピーできないようでした。

以上です。
見当違いでしたら申し訳ありません。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-08-02 10:03
引用:

庚さんの書き込み (2006-08-02 09:40) より:
object node = treeView1.TopNode.Clone();
TreeView1のTopNodeからノードのクローンを作成し、TreeView2のNodeとして追加しています。


なぜにTopNode?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-02 10:17
すでに答えが出ているっぽいですが。

コード:

    foreach (System.Windows.Forms.TreeNode oTreeNode in this.treeView1.Nodes) {
        this.treeView2.Nodes.Add((System.Windows.Forms.TreeNode)oTreeNode.Clone());
    }


Clone メソッドが怖いので、このメソッドについてのリファレンスを見ておきます。

引用:

MSDN2 ライブラリ - TreeNode.Clone メソッド より:

ツリー ノードと、そのツリー ノードをルートとするサブツリー全体をコピーします。
クローンが作成される対象のツリー ノードとその下位にあるツリー構造がコピーされます。新しいツリー ノートおよびサブツリーには、クローンが作成された TreeNode に割り当てられているすべての子ツリー ノードが含まれます。


とあるので、「シャローコピー」 ではなく 「ディープ コピー」 だと思います。
(インフラストラクチャ寄りの部分なので、それでも何となく怖いのですがw)

# リファレンスを見ると、ご丁寧に 'コード例' までありますね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-08-02 12:16

ところで、TreeView と XML というと @IT の ASP.NET の記事が思い浮かぶんですが、WinForm の話なのか ASP.NET の話なのかどっちなんでしょうか。
alf
常連さん
会議室デビュー日: 2005/11/15
投稿数: 22
お住まい・勤務地: 岐阜県・愛知県
投稿日時: 2006-08-02 12:54

 投稿者のalfです。
 数々の迅速なレスポンス、有難うございます。
 おかげで大変助かりました!
 庚さん、じゃんぬねっとさん両方のやり方で確認しました。
 (ちなみにアプリの形態はWindows Formです)

 仕様ではTreeView上のノードに対して追加/削除などが行われるのですが、
 そう考えると実体コピーよりも参照コピーの方が便利だという事に今更なが
 ら気づきました。(スミマセン)

 つまり、

  2つのTreeViewがコピー元とコピー先としてそれぞれForm上に存在する場合、
  片方のTreeViewのノードが変更されるとそれに合わせてもう一方のコピー
  されたTreeViewのノードも自動的に変更される

 みたいなイメージです。

 で、参照コピーを行うにはシャローコピーすることになると思うのですが、
 自分で作成したクラスに対してMemberwiseClone()を行うのなら、ICloneable
 を派生させてClone()を実装・・・で可能ですが、今回のようにTreeNodeに対して
 シャローコピーを行うにはどうしたらいいでしょうか?
 TreeNodeに対してMemberwiseClone()を使おうとすると当然コンパイルエラー
 (TreeNodeCollection型の修飾子を通してプロテクトメンバobject.Memberwise
 Clone()云々・・・)が出てしまいます。

 折角教えて頂いたのに度重なる質問で申し訳ありません。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-08-02 13:08
たしか、MenuItemは同一の参照を複数のItemsに追加すると最後のやつが有効になってたような記憶があったので試したら
TreeViewではエラーになりますね。
削除追加(単一のNodesにのみ所属させる)か複製を追加しろって。

なので、シャローコピーのNodesをシャローコピー、、、と再帰的にしていくと
結局全部ディープコピーになる。。。

[ メッセージ編集済み 編集者: まどか 編集日時 2006-08-02 13:12 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-02 13:55
引用:

alfさんの書き込み (2006-08-02 12:54) より:

仕様ではTreeView上のノードに対して追加/削除などが行われるのですが、そう考えると実体コピーよりも参照コピーの方が便利だという事に今更ながら気づきました。(スミマセン)
つまり、
2つのTreeViewがコピー元とコピー先としてそれぞれForm上に存在する場合、
片方のTreeViewのノードが変更されるとそれに合わせてもう一方のコピー
されたTreeViewのノードも自動的に変更される
みたいなイメージです。


まどかさんが仰るように無理です。
また、このあたりについては、庚さんが既に述べられていますよね。

引用:

庚さんの書き込み (2006-08-02 09:40) より:

クローンを作成しない場合は、TreeView1からNodeを削除しないとコピーできないようでした。


なぜ、2 つのツリーで同期化を図る必要があるのかはわかりませんけど、
実装次第でいくらでも楽な実装は可能だと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)