C# Drag and Drop labels within FlowLayoutPanels(C# 在 FlowLayoutPanels 中拖放标签)
问题描述
我有一个小问题.我想要制作可以在多个 FlowLayoutPanel 之间拖动生成的标签的程序.但最近几天我试图让拖放工作.我尝试了许多教程、示例等,但总是有些不同,我无法仅提取基本代码.
I have small problem. I want make program where I can drag generated labels between multiple FlowLayoutPanels. But last few days I have tried to make drag and drop working. I tried many tutorials, examples etc. but it is always something bit diferent and I am not able extract only basic code.
类似于 这个程序 但它在 Visual Basic 中,我需要它在 C# 中.我知道这可能很简单,但我是新手.
It is similar to this program but it is in Visual Basic and I need it in C#. I know it is maybe very simple, but I am newbie.
感谢您的帮助.
推荐答案
真正的 Drag&Drop 在应用程序之间最有用,也许在 Forms 之间也是最有用的.
Real Drag&Drop ist most useful between applications and maybe also between Forms.
假设您想在同一 Form 上的 FLPs 之间拖动 Labels,下面的代码应该可以帮助您进行操作..
Assuming you want to drag Labels between FLPs on the same Form, the code below should get you going..
它需要两个 FlowLayoutPanels,分别称为 FLP1 和 FLP2,并首先使用一些 Labels 对其进行初始化.
It takes two FlowLayoutPanels called FLP1 and FLP2 and starts by initializing them with a few Labels.
注意我添加到每个 Label 以模拟 Drag&Drop 动作的三个 鼠标事件!
Note the three mouse events I add to each Label to emulate a Drag&Drop action!
private void Form1_Load(object sender, EventArgs e)
{
// create a few Label with varying Colors for testing..
fillFLP(FLP1, 88);
fillFLP(FLP2, 111);
}
void fillFLP(FlowLayoutPanel FLP, int cc)
{
for (int i = 0; i < 24; i++)
{
Label l = new Label();
// the next 3 lines optional and only are there for testing!
l.AutoSize = false;
l.Text = FLP.Name + " " + i.ToString("00");
l.BackColor = Color.FromArgb(255, cc * 2 - i, 255 - 5 * i, cc + 5 * i);
// add controls and set mouse events:
FLP.Controls.Add(l);
l.MouseDown += l_MouseDown;
l.MouseMove += l_MouseMove;
l.MouseUp += l_MouseUp;
}
}
// the currently moved Label:
Label mvLabel = null;
void l_MouseDown(object sender, MouseEventArgs e)
{
// keep reference
mvLabel = (Label)sender;
}
void l_MouseMove(object sender, MouseEventArgs e)
{
// if we are dragging a label:
if (mvLabel != null)
{
// mouse pos in window coords
Point mvPoint = this.PointToClient(Control.MousePosition);
// the label is still in the FLP, so we start the drg action:
if (mvLabel.Parent != this)
{
mvLabel.Parent = this;
mvLabel.Location = mvPoint;
mvLabel.BringToFront();
}
else
{
// we are already in the form, so we just move
mvLabel.Location = mvPoint;
}
}
}
void l_MouseUp(object sender, MouseEventArgs e)
{
// are we over a FLP? and if so which?
Point MP = Control.MousePosition;
FlowLayoutPanel FLP = null;
Point mLoc1 = FLP1.PointToClient(MP);
Point mLoc2 = FLP2.PointToClient(MP);
if (FLP1.ClientRectangle.Contains(mLoc1)) FLP = FLP1;
else if (FLP2.ClientRectangle.Contains(mLoc2)) FLP = FLP2;
else return; // no! nothing we can do..
// yes, now find out if we are over a label..
// ..or over an empty area
mvLabel.SendToBack();
Control cc = FLP.GetChildAtPoint(FLP.PointToClient(MP));
// if we are over the FLP we can insert at the beginning or the end:
// int mvIndex = 0; // to the beginning
int mvIndex = FLP.Controls.Count; // to the end
// we are over a Label, so we insert before it:
if (cc != null) mvIndex = FLP.Controls.IndexOf(cc);
// move the Label into the FLP
FLP.Controls.Add(mvLabel);
// move it to the right position:
FLP.Controls.SetChildIndex(mvLabel, mvIndex);
// let go of the reference
mvLabel = null;
}
这使您可以在两个 FLP 之间以及通过将 onto 拖放到 FLP 内来回拖放 Lablesstrong> 标签.
This lets you drag and drop Lables to and fro between two FLPs and also within the FLPs by dropping onto Labels.
请注意,如果您想允许在 Labels 之间放置 Labels 并仍然定位在那里,则需要多行几行.
Note that you will need a few extra lines if you want to allow dropping between Labels and still position there..
这篇关于C# 在 FlowLayoutPanels 中拖放标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:C# 在 FlowLayoutPanels 中拖放标签
- CanBeNull和ReSharper-将其用于异步任务? 2022-01-01
- Windows 喜欢在 LINUX 中使用 MONO 进行服务开发? 2022-01-01
- 为什么 C# 中的堆栈大小正好是 1 MB? 2022-01-01
- 使用 rss + c# 2022-01-01
- 带问号的 nvarchar 列结果 2022-01-01
- C# 通过连接字符串检索正确的 DbConnection 对象 2022-01-01
- 是否可以在 .Net 3.5 中进行通用控件? 2022-01-01
- Azure Active Directory 与 MVC,客户端和资源标识同一 2022-01-01
- 在 LINQ to SQL 中使用 contains() 2022-01-01
- 在 C# 中异步处理项目队列 2022-01-01
