C# 在 FlowLayoutPanels 中拖放标签

C# Drag and Drop labels within FlowLayoutPanels(C# 在 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,分别称为 FLP1FLP2,并首先使用一些 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 中拖放标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

Force JsonConvert.SerializeXmlNode to serialize node value as an Integer or a Boolean(强制 JsonConvert.SerializeXmlNode 将节点值序列化为整数或布尔值)
Using JSON to Serialize/Deserialize TimeSpan(使用 JSON 序列化/反序列化 TimeSpan)
Could not determine JSON object type for type quot;Classquot;(无法确定类型“Class的 JSON 对象类型.)
How to deserialize a JSONP response (preferably with JsonTextReader and not a string)?(如何反序列化 JSONP 响应(最好使用 JsonTextReader 而不是字符串)?)
how to de-serialize JSON data in which Timestamp it-self contains fields?(如何反序列化时间戳本身包含字段的JSON数据?)
JSON.Net custom contract serialization and Collections(JSON.Net 自定义合约序列化和集合)