将标签拖放到流布局面板上

本文关键字:流布局 标签 拖放 | 更新日期: 2023-09-27 18:35:45

我试图将标签从FlowLayoutPanel拖动到另一个能够拖动但不会删除标签 FlowLayoutPanel.Im?

我的代码

    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);
    }

将标签拖放到流布局面板上

可以将控件的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);
    }
}