前回はシリアル化できるリストボックスを作成しました。
今回は複数のリストボックスを作成して内容を同期させるリストボックスを作成します。
簡単な説明
ユーザーコントロールを作成してこのなかにListBoxを入れます。
作成するクラスはSynchronizedListBox<T>とします。TはSynchronizedDataクラスを継承しているクラスでないといけません。
SynchronizedGroupというプロパティを作成して、これが同じコントロールが同期の対象となります。またSynchronizedListBox<T>クラスはアイテムとデータをリンクさせることができます。どのアイテムが選択されているかで表示内容を変更することができます。
使用できるメソッド
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)
選択されているアイテムが変更されたときに呼び出されます。
プロパティ
SynchronizedGroup
これが同じリストボックスが同期の対象となります。
bool AllowDrop
ドラッグ&ドロップを許可するかどうかを設定します。
int SelectedItemIndex
選択されているアイテムのインデックスを取得・設定します。
イベント
DragOverItem
アイテムがドラッグオーバーされているときに発生するイベントです。
DragOverObject
何かががドラッグオーバーされているときに発生するイベントです。
DragDropItem
アイテムがドロップされたときに発生するイベントです。
DragDropObject
何かががドロップされたときに発生するイベントです。
SelectedIndexChanged
選択されているアイテムが変更されたときに発生するイベントです。
ソースコードは次回示します。
使い方の一例
前回とほとんど同じです。アイテムの追加、移動、ドラッグ&ドロップをするともうひとつのリストボックスも同じように変化します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
using System; using System.Collections.Generic; using System.Windows.Forms; using NamespaceSerializableListBox; using System.Xml.Serialization; using System.IO; using NamespaceSynchronizedListBox; namespace WindowsFormsApp1 { public class SynchronizedListBoxEx : SynchronizedListBox<SynchronizedDataEx> { } public class SynchronizedGroupEx : SynchronizedGroup<SynchronizedDataEx> { } public class SynchronizedDataEx : SynchronizedData { public string Text2 = ""; public string Text3 = ""; } } namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); SynchronizedGroupEx group = new SynchronizedGroupEx(); synchronizedListBoxEx1.SynchronizedGroup = group; synchronizedListBoxEx2.SynchronizedGroup = group; synchronizedListBoxEx1.DragOverItem += SynchronizedListBoxEx1_DragOverItem; synchronizedListBoxEx1.DragDropItem += SynchronizedListBoxEx1_DragDropItem; synchronizedListBoxEx1.SelectedIndexChanged += SynchronizedListBoxEx1_SelectedIndexChanged; } private void SynchronizedListBoxEx1_DragOverItem(object sender, SynchronizedListBox<SynchronizedDataEx>.DragDropItemArgs e) { if(e.SourceItemIndex != e.TargetItemIndex) e.Effect = DragDropEffects.Move; } private void SynchronizedListBoxEx1_DragDropItem(object sender, SynchronizedListBox<SynchronizedDataEx>.DragDropItemArgs e) { if(e.SourceItemIndex != e.TargetItemIndex) { synchronizedListBoxEx1.MoveItem(e.SourceItemIndex, e.TargetItemIndex); } } private void SynchronizedListBoxEx1_SelectedIndexChanged(object sender, SynchronizedListBox<SynchronizedDataEx>.SelectedIndexChangedArgs e) { int before = e.BeforeSelectIndex; int after = e.AfterSelectIndex; if(before != -1) { synchronizedListBoxEx1.GetData(before).Text = textBox1.Text; synchronizedListBoxEx1.GetData(before).Text2 = textBox2.Text; synchronizedListBoxEx1.GetData(before).Text3 = textBox3.Text; } if(after != -1) { textBox1.Text = synchronizedListBoxEx1.GetData(after).Text; textBox2.Text = synchronizedListBoxEx1.GetData(after).Text2; textBox3.Text = synchronizedListBoxEx1.GetData(after).Text3; } } private void buttonAdd_Click(object sender, EventArgs e) { SynchronizedDataEx dataEx = new SynchronizedDataEx(); dataEx.Text = "名無しさん"; synchronizedListBoxEx1.AddItem(dataEx); } private void textBox1_TextChanged(object sender, EventArgs e) { int ii = synchronizedListBoxEx1.SelectedItemIndex; if(ii != -1) synchronizedListBoxEx1.GetData(ii).Text = textBox1.Text; } public class Doc { public List<SynchronizedDataEx> datas = null; } private void buttonSaveFile_Click(object sender, EventArgs e) { SaveFileDialog dlg = new SaveFileDialog(); if(dlg.ShowDialog() == DialogResult.OK) { int i = synchronizedListBoxEx1.SelectedItemIndex; if(i != -1) { synchronizedListBoxEx1.GetData(i).Text = textBox1.Text; synchronizedListBoxEx1.GetData(i).Text2 = textBox2.Text; synchronizedListBoxEx1.GetData(i).Text3 = textBox3.Text; } Doc doc = new Doc(); doc.datas = synchronizedListBoxEx1.GetDataList(); XmlSerializer xml = new XmlSerializer(typeof(Doc)); StreamWriter sw = new StreamWriter(dlg.FileName); xml.Serialize(sw, doc); sw.Close(); } } private void buttonLoadFile_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); if(dlg.ShowDialog() == DialogResult.OK) { XmlSerializer xml = new XmlSerializer(typeof(Doc)); StreamReader sr = new StreamReader(dlg.FileName); Doc doc = (Doc)xml.Deserialize(sr); sr.Close(); synchronizedListBoxEx1.SetDataList(doc.datas); } } } } |