【问题标题】:C# Drag and Drop labels within FlowLayoutPanelsC# 在 FlowLayoutPanels 中拖放标签
【发布时间】:2015-01-03 00:23:32
【问题描述】:

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

它类似于this program,但它在 Visual Basic 中,我需要它在 C# 中。我知道这可能很简单,但我是新手。

感谢您的帮助。

【问题讨论】:

  • 这不是一个小问题。不要拖动控件,让它看起来像你drag text instead

标签: c# drag-and-drop


【解决方案1】:

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

假设您想在同一个Form 上的FLPs 之间拖动Labels,下面的代码应该可以帮助您进行操作..

它需要两个FlowLayoutPanels,称为FLP1FLP2,并首先用几个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;

}

这使您可以在两个FLPs 之间以及在FLPs 内来回拖放Lables,方法是将放到 Labels

请注意,如果您想允许 Labels 之间放置并仍然定位在那里,您将需要一些额外的行。

【讨论】:

  • 谢谢,这就是我要找的。​​span>
猜你喜欢
  • 2014-03-29
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多