ツリービューを二つ作り、内容は同じにするプログラムをつくります。

アイテムを追加するだけなら簡単です。これは第一引数で指定したノードの子として新しいノードを追加する関数です。

さて、片方のビューにアイテムを追加したとき、もう片方に追加するにはどうすればいいでしょうか?

まず対応するアイテムを知る必要があります。そのためにはノードを追加したときに識別子になるものを用意すればよいのですが、以下の方法が考えられます。

TreeNodeのプロパティ Tagにデータをセットする
TreeNodeのプロパティ Nameにユニークな文字列をセットする

ここでは2つめの方法でやってみようと思います。

このようなクラスを作成しました。これを使えば簡単にできます。

俺的ライブラリをつくる 同期化されたTreeView編

SyncGroup.SetTreeViewでアイテムを同期するツリービューを登録しています。ここから同期対象のTreeViewとTreeNodeを探すようにします。またSyncGroup.SetTreeViewは同じものを2つ以上登録できないような仕組みにしています。

同期の対象になるコントロールを登録する

TreeNodeを追加する

TreeNodeを追加するためには同期の対象として登録したTreeViewから対応しているTreeNodeを見つける必要があります。これをやってくれるのがSyncTreeView.SelectedNodeプロパティです。

対応するものが見つかったらTreeNodeを追加します。

作成したTreeNodeのNameプロパティにユニークな文字列を追加する必要がありますが、時刻を利用しています。これなら他とダブる可能性はないと思います。

parentNodeがnullの場合は一番上の階層の一番最後に追加します。それ以外の場合はparentNodeのNameプロパティを調べて、同じものを探してその子アイテムとして追加しています。

ついでに[一番上の子として追加する][そのアイテムの次に追加する][そのアイテムの前に追加する]メソッドもつくってしまいましょう。

ノードを削除する

追加とセットになるのが削除です。ノードを削除するメソッドは以下のとおりです。