前回の続きです。

複数のTreeViewの内容を同期する

TreeViewをファイルに保存する方法

今回はドラッグ&ドロップに対応できるようにします。そのためにはTreeViewを継承します。しなくてもできるといえばできるけど・・・・

しかしそれぞれのTreeViewでこれをやるのは面倒くさい。そこで継承してSyncTreeViewExというクラスをつくります。

さてドラッグ&ドロップに対応させるにはどうすればいいのでしょうか?

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

ここではドラッグ時には以下の処理がおこなわれます。

ItemDragイベントが発生するとDoDragDropメソッドが実行されます。これによってドラッグ&ドロップの処理がおこなわれます。OnBeginItemDragはドラッグが開始されるときにおこないたい処理、OnEndItemDragはドロップされたあとの処理を書きます。

それからSyncTreeViewのなかにTreeNodeがドラッグされたとき専用のイベントとしてDragOverExを作成しています。

DragEventExArgsを調べるとドラッグ&ドロップに関するたいていのことはわかるようになっています。

移動する場合、移動先が移動元の子孫であってはいけません。そのためCanMoveメソッドでチェックをしています。

そこでSyncTreeViewを継承したSyncTreeViewExクラスのOnDragOverExには以下のように書いてみます。

通常のドラッグなら移動、Ctrlキーが押されているときはTreeNodeをコピーします。

それからドロップ時の処理ですが、SyncTreeViewクラスではこのようになっています。

TreeNodeがドロップされたときにはOnDragDropExが呼ばれます。そこでこれをオーバーライドすればよいということになります。

ノードの移動またはコピーをおこないます。このプログラムではドロップされたノードの一番下の子の位置に移動します。ほかにもMoveToFirstChild、ドロップされたノードの次の位置であるMoveToNext、前の位置であるMoveToPrevが選択できます。また移動の場合、移動不可能の位置の場合はなにもおきません。

SyncTreeView.MoveToLastChildとSyncTreeView.CopyToLastChildは以下のようになっています。