ドラッグアンドドロップでデータを並べ替えます。

カテゴリからカテゴリにドラッグアンドドロップされた場合はドラッグ元のカテゴリをドロップされた位置のひとつ上に移動します。下のほうにあるカテゴリを一番上のカテゴリの上にドロップしたら一番上に表示されるカテゴリになるのです。

タスクからカテゴリにドラッグアンドドロップされた場合はそのタスクをカテゴリの一番最後に移動させます。

タスクからタスクにドラッグアンドドロップされた場合はドラッグ元のタスクをドロップ先のタスクのひとつ上に移動します。

CategoryUserControlはTaskUserControlのリストをフィールド変数として持っています。またTaskUserControlは自分が属するカテゴリのCategoryUserControlとそのカテゴリがもつタスクのリストをフィールド変数として持っています。タスクは自分が属するカテゴリが変わると自分が属するカテゴリのタスクのリストも変更しなければなりません。

CategoryUserControlに以下を追加します。

まずコンストラクタにドラッグアンドドロップを許可するためのコードを追加します。そしてマウスがクリックされたらDoDragDropメソッドを実行します。

CategoryUserControlまたはTaskUserControlがマウスドラッグされているときはマウスカーソルの形状を変えて移動できるようにします。そしてドロップされたらMoveTaskUserControlメソッドまたはMoveCategoryUserControlメソッドを呼び出します。

カテゴリの上にカテゴリがドロップされたらカテゴリの順番を変更します。そしてCategoryUserControls内に格納されているCategoryUserControlの順番を変更したらForm1クラスのShowChartメソッドを呼び出します。クラスの外から呼び出せるようにShowChartメソッドはpublicに変更しておきます。

カテゴリの上にタスクがドロップされたらカテゴリの最後にそのタスクを移動します。このときそのタスクが所属するカテゴリも変更しなければなりません。TaskUserControl.CategoryUserControlはプロパティで属するカテゴリを変更することでその他の変更も同時におこなえるようにしています。

次にTaskUserControlクラスに変更を加えます。やはりここでもドラッグアンドドロップの処理を考えます。

先述したCategoryUserControlプロパティの処理を示します。CategoryUserControlが変更されたらCategoryUserControl.TaskUserControlsも変更しなければなりません。また親のコントロールが変わってしまう場合も考えられます。その場合の処理もおこなっています。

ドラッグアンドドロップに関する処理を示します。

タスクを同じカテゴリ内または異なるカテゴリへ移動させる処理を示します。

それからタスクを削除する処理も追加します。

カテゴリの削除はカテゴリ内のタスクが0になったら自動的に消えます。