将标签拖放到FlowLayoutPanel上

时间:2016-02-22 15:09:52

标签: c# winforms flowlayoutpanel

我试图将标签从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);
    }

1 个答案:

答案 0 :(得分:1)

您可以将控件的Name设置为拖动数据,然后在删除时,按名称查找控件并将其从其父控件集合中删除,并将其添加到目标面板控件集合中。为此:

  1. 为每个目标为drop的控件设置AllowDrop属性。示例中的目标控件可以是FlowLayoutPanel控件。
  2. 处理拖动从它开始的每个控件的MouseDown事件以及该控件的处理程序调用{​​{3}}事件并设置要拖动的数据。示例中的移动控件是标签,此处的数据可以是Name控件。
  3. 处理每个拖动目标的DoDragDrop事件并设置DragEnetr以确定是否允许丢弃。这是您可以检查是否允许丢弃的地方。例如,您可以检查数据是否为字符串,字符串是控件的名称。
  4. Hanlde e.Effect并使用DragDropGetData方法获取数据并在删除时执行操作。此处的操作是从当前父级中删除控件并将其添加到新父级。
  5. <强>代码:

    使用以下代码,如果您将control_MouseDown分配给所有标签的MouseDown个事件,并为两个流布局面板分配panel_DragEnterDragEnter事件,并指定{{两个流布局面板的1}}到panel_DragDrop事件,您可以在两个流布局面板之间移动标签,也可以在面板中重新订购标签:

    DragDrop