C#在FlowLayoutPanels中拖放标签
我有小问题。 我想要make程序,我可以在多个FlowLayoutPanel之间拖动生成的标签。 但最近几天我试图拖放工作。 我尝试了许多教程,示例等但它总是有点不同,我不能只提取基本代码。
它与此程序类似,但它在Visual Basic中,我需要它在C#中。 我知道这可能很简单,但我是新手。
谢谢你的帮助。
Real Drag&Drop
在应用程序之间最有用,也可能在Forms
之间。
假设你想在同一个Form
上的FLPs
之间拖动Labels
,下面的代码应该让你去..
它需要两个名为FLP1
和FLP2
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
之间删除并仍然位于那里,则需要一些额外的行。
- 从SQL Server 2008到C#的Geo函数(多边形/地图区域内外的纬度和经度点)
- 是否有现有的库将JSON解析为.net中的Dictionary ?
- 用另一台计算机呼叫计算机(拨号调制解调器)
- 将字符串值转换为hex十进制
- ODP.NET Oracle.ManagedDataAcess随机ORA-12570错误
- 通过表达式EPPlus格式化条件
- ASP.NET vNext – MissingMethodException:找不到方法:Microsoft.CodeAnalysis.Diagnostic> EmitResult.get_Diagnostics()’
- 如何使Moq忽略ref或out的参数
- 为什么不能将anon函数与动态参数一起使用?