2016-02-22 4 views
1

Im пытается перетащить ярлык из FlowLayoutPanel в другой FlowLayoutPanel.Im можно перетаскивать, но он не потеряет метку?Ярлык перетаскивания на FlowLayoutPanel

Мой код

private void flp_DragEnter(object sender, DragEventArgs e) 
    { 
     if ((e.AllowedEffect & DragDropEffects.Link) != 0 

     && e.Data.GetDataPresent(typeof(string))) 

      e.Effect = DragDropEffects.Link; 
    } 

    private void flp_DragDrop(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(typeof(Label))) 
     { 
      FlowLayoutPanel destination = (FlowLayoutPanel)sender; 
      Control control = (Control)e.Data.GetData(typeof(Label)); 
      destination.Controls.Add(control); 
      return; 
     } 
    } 

    private void lbl_MouseDown(object sender, MouseEventArgs e) 
    { 
     DoDragDrop((sender as Label).Text, DragDropEffects.Link); 
    } 
+1

Вы перетаскиваете текст на этикетке, но ожидая, что метка будет удалена. –

ответ

1

Вы можете установить Name элементов управления, как данные сопротивления, а затем, когда снижается, найти управление по имени и удалить его из родительского контроля коллекции и добавить ее в целевые параметры на панели управления коллекция. Для этого:

  1. AllowDrop Недвижимость для каждого элемента управления, предназначенного для капли. Целевой элемент управления в вашем примере может быть как FlowLayoutPanel элементов управления.
  2. Ручка MouseDown Событие для каждого элемента управления, с которого начинается перетаскивание, и в вызове обработчика DoDragDrop события этого элемента управления и установки данных, которые вы хотите перетащить. Элементы управления перемещением в вашем примере - это метки, а данные здесь могут быть Name управления.
  3. Ручка DragEnetr Событие каждой цели перетаскивания и задано e.Effect, чтобы определить, разрешено ли падение или нет. Здесь вы можете проверить, разрешено ли падение. Например, вы можете проверить, являются ли данные строкой, а строка - именем элемента управления.
  4. 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); 
    } 
} 
+0

Точно, что я хотел :), как бы я изменил цвет метки в зависимости от того, в какой панели находится? – AndroidAL

+1

В 'panel_DragDrop' вы можете проверить' panel.Name' и решить, основываясь на имени панели. Также вы можете обрабатывать событие 'ControlAdded' для каждой панели и устанавливать' e.Control.BackColor'. –

+0

Большое спасибо, не могли бы вы привести пример, используя свой код выше? – AndroidAL

Смежные вопросы