В интернете достаточно много статей в которых описывается, как реализовать перемещение элементов списка 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″]
Человек!!! Я люблю тебя!!! ты меня спас))
Спасибо!!!