以前にドラッグ&ドロップで項目の順序を変更できるリストボックスを作成しました。

ドラッグ&ドロップで項目の順序を変更できるリストボックス 自作コントロール

今回はファイルとしてデータを保存できるリストボックスを作成します。

ListViewコントロールだと

というやり方もできるのですが、ListBoxの場合はそうはいかないので別にデータを扱う方法を考えます。

簡単な説明

Dataというクラスを作成し、そのインスタンスをリストに格納します。ただListBoxに普通にアイテムを追加してしまうとこの方法はとれないのでアイテムを追加するための方法に制限をかけます。

ユーザーコントロールを作成してこのなかにListBoxを入れます。これだと外部からは指定されたメソッドを使わないとアイテムを追加することができなくなります。

作成するクラスはSerializableListBox<T>とします。TはDataクラスを継承しているクラスでないといけません。

またSerializableListBoxクラスはアイテムとデータをリンクさせることができます。どのアイテムが選択されているかで表示内容を変更することができます。

使用できるメソッド

void AddItem(T data)
アイテムを最後に追加します。

void InsertItem(T data, int index)
アイテムを指定した場所に追加します。

void RemoveItem(int index)
指定した場所にあるアイテムを削除します。

void ClearItems()
アイテムをすべて削除します。

void MoveItem(int fromIndex, int toIndex)
第一引数で指定されたアイテムを第二引数で指定した場所に移動します。

void MoveItemLast(int fromIndex)
第一引数で指定されたアイテムを最後に移動します。

T GetData(int i)
第一引数で指定された場所にあるデータを取得します。

List<T> GetDataList()
シリアル化のためにデータのリストを取得します。

void SetDataList(List<T> dataList)
逆シリアル化で得られたデータのリストからリストボックスのアイテムを復元します。

virtual void OnDragOverItem(DragDropItemArgs e)
アイテムがドラッグオーバーされているときに呼び出されます。

virtual void OnDragOverObject(DragEventArgs e)
なにかがドラッグオーバーされているときに呼び出されます。

virtual void OnDragDropItem(DragDropItemArgs e)
アイテムがドロップされたときに呼び出されます。

virtual void OnDragDropObject(DragEventArgs e)
なにかがドロップされたときに呼び出されます。

virtual void OnSelectedIndexChanged(SelectedIndexChangedArgs e)
選択されているアイテムが変更されたときに呼び出されます。

プロパティ

bool AllowDrop
ドラッグ&ドロップを許可するかどうかを設定します。

int SelectedItemIndex
選択されているアイテムのインデックスを取得・設定します。

イベント

DragOverItem
アイテムがドラッグオーバーされているときに発生するイベントです。

DragOverObject
何かががドラッグオーバーされているときに発生するイベントです。

DragDropItem
アイテムがドロップされたときに発生するイベントです。

DragDropObject
何かががドロップされたときに発生するイベントです。

SelectedIndexChanged
選択されているアイテムが変更されたときに発生するイベントです。

ソースコードは次回示します。

シリアル化できるリストボックスのソースコード 自作コントロール

使い方の一例

仕様

[追加]ボタンを押すと一番後ろに新しいアイテムが作成されます。

ドラッグ&ドロップでアイテムを移動できます。

選択されているアイテムが変更されるとこれまで選択されていたアイテムに対応するデータが保存され、新たに選択されたアイテムに対応するデータが読み出されて表示されます。

ファイルの保存と読み出しが可能です。

まずデータを扱うクラスを作成します。このクラスはDataクラスを継承している必要があります。Dataクラスの内容は次回示します。

シリアル化できるリストボックスのソースコード 自作コントロール

ソースコード

次にSerializableListBoxクラスを継承してSerializableListBoxDataクラスをつくります。これでデザイナでドラッグ&ドロップで使えるようになります。

最後にForm1クラスを作成します。