DragDrop控件之间

时间:2012-02-09 07:28:35

标签: c# drag-and-drop controls containers

我遇到了DragDrop的问题。

    private void Form0_Load(object sender, EventArgs e)
    {
        PictureBox panel1 = new PictureBox();
        PictureBox panel2 = new PictureBox();

        mainPanel.Dock = DockStyle.Fill;
        this.Controls.Add(mainPanel);

        panel1.Location = new Point(10, 10);
        panel1.Size = new System.Drawing.Size(500, 300);
        panel1.BorderStyle = BorderStyle.FixedSingle;

        Button b2 = new Button();
        b2.Location = new Point(10, 10);
        panel2.Controls.Add(b2);
        panel2.Location = new Point(10, 10);
        panel2.Size = new System.Drawing.Size(200, 100);
        panel2.BorderStyle = BorderStyle.FixedSingle;

        foreach (Control c in panel1.Controls)
        {
            c.MouseDown += new MouseEventHandler(control_MouseDown);
            c.MouseMove += new MouseEventHandler(control_MouseMove);
            c.MouseUp += new MouseEventHandler(control_MouseUp);
            c.AllowDrop = true;
        }
        panel1.AllowDrop = true;

        panel1.DragEnter += new DragEventHandler(container_DragEnter);
        panel1.DragDrop += new DragEventHandler(container_DragDrop);
        panel1.DragOver += new DragEventHandler(container_DragOver);

        foreach (Control c in panel2.Controls)
        {
            c.MouseDown += new MouseEventHandler(control_MouseDown);
            c.MouseMove += new MouseEventHandler(control_MouseMove);
            c.MouseUp += new MouseEventHandler(control_MouseUp);
            c.AllowDrop = true;
        }
        panel2.AllowDrop = true;

        panel2.DragEnter += new DragEventHandler(container_DragEnter);
        panel2.DragDrop += new DragEventHandler(container_DragDrop);
        panel2.DragOver += new DragEventHandler(container_DragOver);

        mainPanel.Controls.Add(panel1);
        mainPanel.Controls.Add(panel2);
        mainPanel.Controls.Add(pb);
    }

    private void control_MouseDown(object sender, MouseEventArgs e)
    {
        Control c = sender as Control;
        isDragging = true;
        clickOffsetX = e.X;
        clickOffsetY = e.Y;
    }

    private void control_MouseMove(object sender, MouseEventArgs e)
    {
        Control c = sender as Control;
        if (isDragging == true)
        {
            c.Left = e.X + c.Left - clickOffsetX;
            c.Top = e.Y + c.Top - clickOffsetY;
            if (c.Location.X + clickOffsetX > c.Parent.Width ||
                c.Location.Y + clickOffsetY > c.Parent.Height ||
                c.Location.X + clickOffsetX < 0 ||
                c.Location.Y + clickOffsetY < 0)

                c.DoDragDrop(c, DragDropEffects.Move);
        }
    }

    private void control_MouseUp(object sender, MouseEventArgs e)
    {
        isDragging = false;
    }

    void container_DragOver(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Move;
    }

    private void container_DragEnter(object sender, DragEventArgs e)
    {
        //e.Effect = DragDropEffects.Move;

        //if (e.Data.GetDataPresent(typeof(Bitmap)))
        //{
        //    e.Effect = DragDropEffects.Copy;
        //}
        //else
        //{
        //    e.Effect = DragDropEffects.None;
        //}
    }

    private void container_DragDrop(object sender, DragEventArgs e)
    {
        Control c = e.Data.GetData(e.Data.GetFormats()[0]) as Control;
        PictureBox p = sender as PictureBox;
        mycontrol = c;
        isDragging = false;
        if (c != null)
        {
            c.Location = p.PointToClient(new Point(e.X, e.Y));
            p.Controls.Add(c);
        }
    }

这是一个有效的例子。但我不能做从父控制到控制的控制。什么是魔术?如何将控制权交给另一个控件(在我的例子中从panel1到panel2)。

1 个答案:

答案 0 :(得分:1)

这里有一些答案可以帮助你:

请参阅此Move controls when Drag and drop on panel in C#

这是关于如何托管表单设计器的完整示例:

Tailor Your Application by Building a Custom Forms Designer with .NET

检查这个也是为了简单的标签拖放: Basic drag and drop in WinForms