问题描述
我有一个小问题.我想要制作可以在多个 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 中拖放标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)