Вы можете установить Name
элементов управления, как данные сопротивления, а затем, когда снижается, найти управление по имени и удалить его из родительского контроля коллекции и добавить ее в целевые параметры на панели управления коллекция. Для этого:
AllowDrop
Недвижимость для каждого элемента управления, предназначенного для капли. Целевой элемент управления в вашем примере может быть как FlowLayoutPanel
элементов управления.
- Ручка
MouseDown
Событие для каждого элемента управления, с которого начинается перетаскивание, и в вызове обработчика DoDragDrop
события этого элемента управления и установки данных, которые вы хотите перетащить. Элементы управления перемещением в вашем примере - это метки, а данные здесь могут быть Name
управления.
- Ручка
DragEnetr
Событие каждой цели перетаскивания и задано e.Effect
, чтобы определить, разрешено ли падение или нет. Здесь вы можете проверить, разрешено ли падение. Например, вы можете проверить, являются ли данные строкой, а строка - именем элемента управления.
- Hanlde
DragDrop
и использовать GetData
метод e.Data
для получения данных и выполнения действий при падении. Действие здесь - удаление элемента управления из его текущего родителя и добавление его в новый родитель.
Код:
Используя приведенный ниже код, если вы назначаете control_MouseDown
на MouseDown
события всех меток и назначить panel_DragEnter
для DragEnter
события обеих компоновочных потока панелей, а также назначить panel_DragDrop
в DragDrop
случае подающем панели макетов, вы можете перемещать метки между обеими макетами раскладки, а также вы можете заказать ярлыки в панели:
private void control_MouseDown(object sender, MouseEventArgs e)
{
var control = sender as Control;
this.DoDragDrop(control.Name, DragDropEffects.Move);
}
private void panel_DragEnter(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent(typeof(string)))
return;
var name = e.Data.GetData(typeof(string)) as string;
var control = this.Controls.Find(name, true).FirstOrDefault();
if (control != null)
{
e.Effect = DragDropEffects.Move;
}
}
private void panel_DragDrop(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent(typeof(string)))
return;
var name = e.Data.GetData(typeof(string)) as string;
var control = this.Controls.Find(name, true).FirstOrDefault();
if (control != null)
{
control.Parent.Controls.Remove(control);
var panel = sender as FlowLayoutPanel;
((FlowLayoutPanel)sender).Controls.Add(control);
}
}
Вы перетаскиваете текст на этикетке, но ожидая, что метка будет удалена. –