C#在FlowLayoutPanels中拖放标签

我有小问题。 我想要make程序,我可以在多个FlowLayoutPanel之间拖动生成的标签。 但最近几天我试图拖放工作。 我尝试了许多教程,示例等但它总是有点不同,我不能只提取基本代码。

它与此程序类似,但它在Visual Basic中,我需要它在C#中。 我知道这可能很简单,但我是新手。

谢谢你的帮助。

Real Drag&Drop在应用程序之间最有用,也可能在Forms之间。

假设你想在同一个Form上的FLPs之间拖动Labels ,下面的代码应该让你去..

它需要两个名为FLP1FLP2 FlowLayoutPanels ,并通过使用一些Labels初始化它们来开始。

请注意我添加到每个Label的三个鼠标事件 ,以模拟Drag&Drop操作!

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

这使您可以通过拖放 Labels 上来拖放两个FLPs之间以及FLPs内的Labels

请注意,如果要允许 Labels 之间删除并仍然位于那里,则需要一些额外的行。