将标签拖放到流布局面板上
本文关键字:流布局 标签 拖放 | 更新日期: 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
设置为拖动数据,然后在拖放时,按名称查找控件并将其从其父控件集合中删除,并将其添加到目标面板控件集合中。为此:
- 为作为放置目标的每个控件设置
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);
}
}