在C#中拖放面板时移动控件

时间:2010-03-13 16:29:00

标签: .net winforms drag-and-drop panel

我想在面板上拖动控件,拖动时我想移动控件并将其位置放到面板上。我已经尝试过mouseUp,mouseDown,MouseMove控件事件。但这不是我要找的东西。我想在面板上触发DragDrop事件并移动控件。我可以这样做吗?如果你能给我一个想法,它会很棒。以下是我的代码的一部分。请指正。非常感谢。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DragnDrop
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }
        Control mycontrol;
        int x, y;
        //Form1 f = new Form1();
        private void Form1_Load(object sender, EventArgs e)
        {

            foreach (Control c in this.panel1.Controls)
            {
                c.MouseMove += new MouseEventHandler(lblDragger_MouseMove);
                c.MouseUp += new MouseEventHandler(lblDragger_MouseUp);
                c.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
                c.MouseDoubleClick += new MouseEventHandler(pictureBox1_MouseDown);
            }
            panel2.AllowDrop = true;
            foreach (Control c in this.panel2.Controls)
            {
                c.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
            }
            panel2.DragOver += new DragEventHandler(panel2_DragOver);
            panel2.DragDrop += new DragEventHandler(panel2_DragDrop);  
        }

        bool isDragging ;
        int  clickOffsetX ;
        int  clickOffsetY ;

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            //  this.Cursor = Cursors.SizeAll;
            //pictureBox1 = (PictureBox)sender;
            Control c = sender as Control;

            //DoDragDrop(pictureBox1.Image, DragDropEffects.Copy);
            // validation = true;
            isDragging = true;
            clickOffsetX = e.X;
            clickOffsetY = e.Y;
            //  c.DoDragDrop(c, DragDropEffects.Move);  
        }

        private void lblDragger_MouseUp(System.Object sender, System.Windows.Forms.MouseEventArgs e)
        {
            isDragging = false;
        }

        private void panel2_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(Bitmap)))
            {
                e.Effect = DragDropEffects.Copy;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
        }

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

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

        private void lblDragger_MouseMove(System.Object sender,
          System.Windows.Forms.MouseEventArgs e)
        {
            Control c = sender as Control;
            // bool isDragging = true;
            if (isDragging == true)
            {
                c.Left = e.X + c.Left - clickOffsetX;
                c.Top = e.Y + c.Top - clickOffsetY;
            }
        }

        private void panel1_MouseLeave(object sender, EventArgs e)
        {
            Control c = sender as Control;

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

2 个答案:

答案 0 :(得分:9)

如果你的控件已经在面板上并且你只是在同一个面板中移动它,那么使用鼠标事件可能是最简单的方法。我的理解是Drag and Drop更多的是在控件甚至应用程序之间传递数据。例如,如果您尝试允许控件在面板之间传输,则拖放将非常适合。


如果你想同时做到这两点,那么这里有一个可能的想法:

  1. 使用鼠标事件在同一面板中执行移动拖动。

  2. 当您在面板上获得MouseLeave事件时,开始一个DragDrop操作(一些示例here)您可以从面板中删除控件或添加某种“灰色”效果来指示控制可能正在离开。

  3. 处理目标面板上的DragDrop并将控件放在拖放的鼠标位置。

  4. 这结合了拖动控件的直观感觉,同时还提供了一种将“过去”面板拖到新表面的方法。

答案 1 :(得分:1)

您需要使用鼠标按下和鼠标按下事件来切换拖动状态。当你向下鼠标时,你开始拖动。您可以记录控件中鼠标的相对位置以及控件在面板中的相对位置。然后在移动时按下鼠标并相对于控件中鼠标的原始位置重新定位控件的顶部和左侧。