Перетаскивание и перемещение элементов Перетаскивание и перемещение элементов из одного элемента 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-канал.