Перетаскивание и перемещение элементов Перетаскивание и перемещение элементов из одного элемента CheckedListBox в другой с помощью Windows Forms

Автор: Супротим Агарвал (Suprotim Agarwal)

Аннотация. В этой статье будет показано, как перетаскивать и перемещать элементы из одного элемента Checkedlistbox в другой.

В этой статье будет показано, как перетаскивать и перемещать элементы из одного элемента Checkedlistbox в другой. Выполните следующие действия:

Шаг 1. Откройте Visual Studio > Файл > Создать > Проект. В области "Типы проектов" выберите нужный язык (Visual C# или Visual Basic). В области "Шаблоны" выберите "Приложение Windows". Выберите имя и папку проекта, а затем нажмите кнопку ОК.

Шаг 2. Теперь перетащите два элемента управления Checkedlistbox (checkedListBoxA b checkedListBoxB) на форму. Сначала заполним список checkedListBoxA несколькими элементами, а затем во время выполнения перетащим и переместим элементы в список checkedListBoxB. Элементы также можно переместить обратно в список checkedListBoxA. В первую очередь в ходе перетаскивания будут обрабатываться 3 события. Этими событиями являются:

Событие MouseDown элемента CheckedListBox — это событие обрабатывается, когда указатель мыши находится над элементом списка CheckedListBox и нажимается кнопка мыши.

Событие DragOver Event элемента CheckedListBox — это событие обрабатывается, когда элемент списка перетаскивается в конечный список Checkedlistbox

Событие DragDrop элемента CheckedListBox — это событие обрабатывается при завершении операции перетаскивания.

Шаг 3. Теперь пойдем дальше и добавим в форму код. В файле Form1.cs или Form1.vb добавьте следующий код в конструктор формы:

C#

int itemIndex;

 

public Form1()

{

    InitializeComponent();

    checkedListBoxA.MouseDown += new MouseEventHandler(checkedListBox_MouseDown);

    checkedListBoxA.DragOver += new DragEventHandler(checkedListBox_DragOver);

    checkedListBoxA.DragDrop += new DragEventHandler(checkedListBox_DragDrop);

    checkedListBoxB.MouseDown += new MouseEventHandler(checkedListBox_MouseDown);

    checkedListBoxB.DragOver += new DragEventHandler(checkedListBox_DragOver);

    checkedListBoxB.DragDrop += new DragEventHandler(checkedListBox_DragDrop);

    checkedListBoxA.AllowDrop = true;

    checkedListBoxB.AllowDrop = true;

}

 

private void Form1_Load(object sender, EventArgs e)

{

    checkedListBoxA.Items.Add("Item 1");

    checkedListBoxA.Items.Add("Item 2");

    checkedListBoxA.Items.Add("Item 3");

    checkedListBoxA.Items.Add("Item 4");

    checkedListBoxA.Items.Add("Item 5");

    checkedListBoxA.Items.Add("Item 6");

}

VB.NET

Private itemIndex As Integer
 
Public Sub New()
      InitializeComponent()
      AddHandler checkedListBoxA.MouseDown, AddressOf checkedListBox_MouseDown
      AddHandler checkedListBoxA.DragOver, AddressOf checkedListBox_DragOver
      AddHandler checkedListBoxA.DragDrop, AddressOf checkedListBox_DragDrop
      AddHandler checkedListBoxB.MouseDown, AddressOf checkedListBox_MouseDown
      AddHandler checkedListBoxB.DragOver, AddressOf checkedListBox_DragOver
      AddHandler checkedListBoxB.DragDrop, AddressOf checkedListBox_DragDrop
      checkedListBoxA.AllowDrop = True
      checkedListBoxB.AllowDrop = True
End Sub
 
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
      checkedListBoxA.Items.Add("Item 1")
      checkedListBoxA.Items.Add("Item 2")
      checkedListBoxA.Items.Add("Item 3")
      checkedListBoxA.Items.Add("Item 4")
      checkedListBoxA.Items.Add("Item 5")
      checkedListBoxA.Items.Add("Item 6")
End Sub

В приведенном выше коде регистрируются события MouseDown, DragOver и DragDrop для двух списков CheckedListBox, а в методе Form_Load список checkedListBoxA заполняется несколькими элементами.

Шаг 4. Теперь добавим код в описанные выше события:

C#

private void checkedListBox_MouseDown(object sender, MouseEventArgs e)

{

    CheckedListBox clb = sender as CheckedListBox;

    itemIndex = clb.IndexFromPoint(e.X, e.Y);

    if (itemIndex >= 0 & e.Button == MouseButtons.Left)

    {

        clb.DoDragDrop(clb.Items[itemIndex], DragDropEffects.Move);

    }

}

 

private void checkedListBox_DragOver(object sender, DragEventArgs e)

{

    if (e.Data.GetDataPresent(typeof(System.String)))

    {

        e.Effect = DragDropEffects.Move;

    }

    else

    {

        e.Effect = DragDropEffects.None;

    }

}

 

private void checkedListBox_DragDrop(object sender, DragEventArgs e)

{

    CheckedListBox clbSender = sender as CheckedListBox;

    clbSender.Items.Add(e.Data.GetData(typeof(System.String)).ToString());

 

    if(clbSender.Name == "checkedListBoxA")

        checkedListBoxB.Items.RemoveAt(itemIndex);

    else

        checkedListBoxA.Items.RemoveAt(itemIndex);

}

VB.NET

Private Sub checkedListBox_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
      Dim clb As CheckedListBox = TryCast(sender, CheckedListBox)
      itemIndex = clb.IndexFromPoint(e.X, e.Y)
      If itemIndex >= 0 And e.Button = MouseButtons.Left Then
            clb.DoDragDrop(clb.Items(itemIndex), DragDropEffects.Move)
      End If
End Sub
 
Private Sub checkedListBox_DragOver(ByVal sender As Object, ByVal e As DragEventArgs)
      If e.Data.GetDataPresent(GetType(System.String)) Then
            e.Effect = DragDropEffects.Move
      Else
            e.Effect = DragDropEffects.None
      End If
End Sub
 
Private Sub checkedListBox_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)
      Dim clbSender As CheckedListBox = TryCast(sender, CheckedListBox)       clbSender.Items.Add(e.Data.GetData(GetType(System.String)).ToString())
 
      If clbSender.Name = "checkedListBoxA" Then
            checkedListBoxB.Items.RemoveAt(itemIndex)
      Else
            checkedListBoxA.Items.RemoveAt(itemIndex)
      End If
End Sub

Так как перетаскивание разрешено для обоих списков CheckedListBox, большая часть кода будет общей. Поэтому есть смысл определить общие обработчики событий.

В событии checkedListBox_MouseDown сначала выполняется приведение отправителя к типу CheckedListBox, а затем определяется индекс элемента, используя using IndexFromPoint(). Возвращенный индекс — это индекс элемента, выделенного пользователем для перетаскивания. Затем для отправителя вызывается метод DoDragDrop(). Этот метод запускает операцию перетаскивания и принимает параметр object(checkedlistbox item), определяющий перетаскиваемый объект. Второй параметр определяет эффект перетаскивания.

В методе checkedListBox_DragOver проверяется, является ли перетаскиваемый элемент допустимым для перетаскивания объектом.

Наконец в методе checkedListBox_DragDrop сначала отправитель приводится к типу CheckedListBox, затем перетаскиваемый извлекается с помощью e.Data.GetData(), потом извлеченный элемент добавляется в коллекцию элементов списка checkedListBox. Чтобы обеспечить эффект перемещения, перетащенный элемент удаляется и списка-отправителя Checkedlistbox.

Это все. Запустите пример, и вы сможете выполнять операции перетаскивания и удаления для элемента CheckedListBox. Я надеюсь, эта статья была полезной, и благодарю за то, что вы ее прочитали.

Если статья понравилась, подпишитесь на мой RSS-канал.