NonSoft

ListBoxでドラッグ&ドロップするサンプル(C#.NET)


 サンプル(ソース/コード)
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);
    }
}