Перемещение элементов ListBox мышью

В интернете достаточно много статей в которых описывается, как реализовать перемещение элементов списка ListBox с помощью кнопок «Переместить вверх» «Переместить вниз». Но примера реализации перемещения с помощью мыши я так и не нашел (быть может плохо искал :). Поэтому решил написать отдельную статью, возможно кому-то будет полезно.

Идею я реализовал с помощью функции Drag&Drop. Привожу сразу код.
Я прокомментировал основные моменты, поэтому, думаю, вопросов не должно возникнуть:

 

//индекс перемещаемого элемента
int indexToMove;

public Form1()
{
    InitializeComponent();

    listBox1.AllowDrop = true;

    //подписываемся на события
    listBox1.MouseMove += new MouseEventHandler(listBox1_MouseMove);
    listBox1.DragEnter += new DragEventHandler(listBox1_DragEnter);
    listBox1.DragDrop += new DragEventHandler(listBox1_DragDrop);

    //заполняем список
    for (int i = 0; i < 10; i++)
    {
        listBox1.Items.Add(i);
    }

}

private void listBox1_MouseMove(object sender, MouseEventArgs e)
{
    //если нажата левая кнопка мыши, начинаем Drag&Drop
    if (e.Button == MouseButtons.Left)
    {
        //индекс элемента, который мы перемещаем
        indexToMove = listBox1.IndexFromPoint(e.X, e.Y);
        listBox1.DoDragDrop(indexToMove, DragDropEffects.Move);
    }
}

private void listBox1_DragEnter(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Move;
}

private void listBox1_DragDrop(object sender, DragEventArgs e)
{
    //индекс, куда перемещаем
    //listBox1.PointToClient(new Point(e.X, e.Y)) - необходимо
    //использовать поскольку в e храниться
    //положение мыши в экранных коородинатах, а эта
    //функция позволяет преобразовать в клиентские
    int newIndex = listBox1.IndexFromPoint(listBox1.PointToClient(new Point(e.X, e.Y)));
    //если вставка происходит в начало списка
    if (newIndex == -1)
    {
        //получаем перетаскиваемый элемент
        object itemToMove = listBox1.Items[indexToMove];
        //удаляем элемент
        listBox1.Items.RemoveAt(indexToMove);
        //добавляем в конец списка
        listBox1.Items.Add(itemToMove);
    }
    //вставляем где-то в середину списка
    else if (indexToMove != newIndex)
    {
        //получаем перетаскиваемый элемент
        object itemToMove = listBox1.Items[indexToMove];
        //удаляем элемент
        listBox1.Items.RemoveAt(indexToMove);
        //вставляем в конкретную позицию
        listBox1.Items.Insert(newIndex, itemToMove);
    }
}

 
В итоге мы получаем возможность перемещать мышью элементы списка ListBox
 

 

  ListBoxMouseMoveItem.rar (34,1 KiB, 1 574 закачек)

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Google Buzz
Опубликовать в Одноклассники
Опубликовать в Яндекс
Опубликовать в Мой Мир

Похожие статьи

Комментарии (2) на “Перемещение элементов ListBox мышью”

Оставить комментарий