- - PR -
TreeViewオブジェクトのコピー方法(C#)
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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-08-02 09:40
はじめまして。お世話になります。
やりたいこと: 「TreeView1に表示されているノードを、TreeView2にコピーしたい。」 ということでよろしいでしょうか? それだとこんな感じでできます。 object node = treeView1.TopNode.Clone(); treeView2.Nodes.Add((TreeNode)node); TreeView1のTopNodeからノードのクローンを作成し、TreeView2のNodeとして追加しています。 クローンを作成しない場合は、TreeView1からNodeを削除しないとコピーできないようでした。 以上です。 見当違いでしたら申し訳ありません。 | ||||||||
|
投稿日時: 2006-08-02 10:03
なぜにTopNode? | ||||||||
|
投稿日時: 2006-08-02 10:17
すでに答えが出ているっぽいですが。
Clone メソッドが怖いので、このメソッドについてのリファレンスを見ておきます。
とあるので、「シャローコピー」 ではなく 「ディープ コピー」 だと思います。 (インフラストラクチャ寄りの部分なので、それでも何となく怖いのですがw) # リファレンスを見ると、ご丁寧に 'コード例' までありますね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-08-02 12:16
ところで、TreeView と XML というと @IT の ASP.NET の記事が思い浮かぶんですが、WinForm の話なのか ASP.NET の話なのかどっちなんでしょうか。 | ||||||||
|
投稿日時: 2006-08-02 12:54
投稿者のalfです。 数々の迅速なレスポンス、有難うございます。 おかげで大変助かりました! 庚さん、じゃんぬねっとさん両方のやり方で確認しました。 (ちなみにアプリの形態はWindows Formです) 仕様ではTreeView上のノードに対して追加/削除などが行われるのですが、 そう考えると実体コピーよりも参照コピーの方が便利だという事に今更なが ら気づきました。(スミマセン) つまり、 2つのTreeViewがコピー元とコピー先としてそれぞれForm上に存在する場合、 片方のTreeViewのノードが変更されるとそれに合わせてもう一方のコピー されたTreeViewのノードも自動的に変更される みたいなイメージです。 で、参照コピーを行うにはシャローコピーすることになると思うのですが、 自分で作成したクラスに対してMemberwiseClone()を行うのなら、ICloneable を派生させてClone()を実装・・・で可能ですが、今回のようにTreeNodeに対して シャローコピーを行うにはどうしたらいいでしょうか? TreeNodeに対してMemberwiseClone()を使おうとすると当然コンパイルエラー (TreeNodeCollection型の修飾子を通してプロテクトメンバobject.Memberwise Clone()云々・・・)が出てしまいます。 折角教えて頂いたのに度重なる質問で申し訳ありません。 | ||||||||
|
投稿日時: 2006-08-02 13:08
たしか、MenuItemは同一の参照を複数のItemsに追加すると最後のやつが有効になってたような記憶があったので試したら
TreeViewではエラーになりますね。 削除追加(単一のNodesにのみ所属させる)か複製を追加しろって。 なので、シャローコピーのNodesをシャローコピー、、、と再帰的にしていくと 結局全部ディープコピーになる。。。 [ メッセージ編集済み 編集者: まどか 編集日時 2006-08-02 13:12 ] | ||||||||
|
投稿日時: 2006-08-02 13:55
まどかさんが仰るように無理です。 また、このあたりについては、庚さんが既に述べられていますよね。
なぜ、2 つのツリーで同期化を図る必要があるのかはわかりませんけど、 実装次第でいくらでも楽な実装は可能だと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |