Перемещение элементов 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
 

 
[download id=”15″]

2 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_bye.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_good.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_negative.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_scratch.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_wacko.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_yahoo.gif 
http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_cool.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_heart.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_rose.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_smile.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_whistle3.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_yes.gif 
http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_cry.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_mail.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_sad.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_unsure.gif  http://csharpcoding.org/wp-content/plugins/wp-monalisa/icons/wpml_wink.gif