|
|||||
ListBoxにドラッグ&ドロップ機能を実装するサンプルソース(C#.NET)です。 ListBoxにはItemDragイベントが無いのでMouseDownやMouseMoveを使用して実装しました。 ListBox1からListBox2へのドラッグ&ドロップやListBox内でのドラッグが出来ます。 Formに2つのListBoxを貼り付けてお試しください。 関連サンプル:ListBoxでドラッグ&ドロップするサンプル(VB.NET) 関連サンプル:ListView/TreeView/ListBox/ComboBoxのサンプル(VB.NET) 関連サンプル:ListView/TreeView/ListBox/ComboBoxのサンプル(C#.NET) ★フォームクラス(Form1.cs) public partial class Form1 : Form { private void Form1_Load(object sender, EventArgs e) { // ListBox1に項目を追加 listBox1.Items.Add("ListBox1.Items(0)"); listBox1.Items.Add("ListBox1.Items(1)"); listBox1.Items.Add("ListBox1.Items(2)"); listBox1.Items.Add("ListBox1.Items(3)"); listBox1.Items.Add("ListBox1.Items(4)"); listBox1.AllowDrop = true; // ListBox2に項目を追加 listBox2.Items.Add("ListBox2.Items(0)"); listBox2.Items.Add("ListBox2.Items(1)"); listBox2.Items.Add("ListBox2.Items(2)"); listBox2.Items.Add("ListBox2.Items(3)"); listBox2.Items.Add("ListBox2.Items(4)"); listBox2.AllowDrop = true; } private int DragStartIdx = -1; private void listBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { // マウスの左ボタンを押した時にListBoxの項目番号を保存 DragStartIdx = ((ListBox)sender).IndexFromPoint( new Point(e.X, e.Y)); } else { // それ以外の時は何もしない DragStartIdx = -1; } } private void listBox2_MouseDown(object sender, MouseEventArgs e) { listBox1_MouseDown(sender, e); } private void listBox1_MouseUp(object sender, MouseEventArgs e) { // マウスのボタンを上げた時は初期状態へ DragStartIdx = -1; } private void listBox2_MouseUp(object sender, MouseEventArgs e) { listBox1_MouseUp(sender, e); } private void listBox1_MouseMove(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left && DragStartIdx >= 0) { if ((Control.ModifierKeys & Keys.Control) == Keys.Control) { // Ctrlキーを押している時はドラッグ&ドロップ ((ListBox)sender).DoDragDrop( ((ListBox)sender).Items[DragStartIdx].ToString(), DragDropEffects.All); } else { // Ctrlキーを押していない時はListBox内のドラッグ int DragEndIdx = ((ListBox)sender).IndexFromPoint(new Point(e.X, e.Y)); if (DragStartIdx >= 0 && DragEndIdx >= 0 && DragStartIdx != DragEndIdx) { if (DragStartIdx < DragEndIdx) { ((ListBox)sender).Items.Insert(DragEndIdx + 1, ((ListBox)sender).Items[DragStartIdx].ToString()); ((ListBox)sender).SelectedIndex = DragEndIdx + 1; ((ListBox)sender).Items.RemoveAt(DragStartIdx); } else if (DragStartIdx > DragEndIdx) { ((ListBox)sender).Items.Insert(DragEndIdx, ((ListBox)sender).Items[DragStartIdx].ToString()); ((ListBox)sender).SelectedIndex = DragEndIdx; ((ListBox)sender).Items.RemoveAt(DragStartIdx + 1); } DragStartIdx = DragEndIdx; } } } } private void listBox2_MouseMove(object sender, MouseEventArgs e) { listBox1_MouseMove(sender, e); } private void listBox1_DragEnter(object sender, DragEventArgs e) { // ドラッグ中にListBox内に入って来た時はドロップ許可 e.Effect = DragDropEffects.Move; } private void listBox2_DragEnter(object sender, DragEventArgs e) { listBox1_DragEnter(sender, e); } private void listBox1_DragDrop(object sender, DragEventArgs e) { // ドラッグ中にマウスのボタンを上げた時はドロップ(最終行への追加) ((ListBox)sender).Items.Add(e.Data.GetData(DataFormats.Text, true)); } private void listBox2_DragDrop(object sender, DragEventArgs e) { listBox1_DragDrop(sender, e); } } |