在自定义控件C#上拖放

时间:2017-08-07 09:27:09

标签: c# .net drag-and-drop

我创建了一个由两个pictureBox和两个标签组成的控件(称为Table)。

我试图将它从一个面板拖放到另一个面板,但它不起作用。 这是我的代码:

    void TableExampleMouseDown(object sender, MouseEventArgs e)
    {
        tableExample.DoDragDrop(tableExample, DragDropEffects.Copy);
    }

    void Panel2DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Copy;
    }

    void Panel2DragDrop(object sender, DragEventArgs e)
    {
        panel2.Controls.Add((Table) e.Data.GetData(e.Data.GetFormats()[0]));
    }

显然我已经在panel2中将AllowDrop设置为true。当我单击Table对象(在panel1中)时,鼠标光标不会改变。看起来MouseDown事件并不会触发......

谢谢!

这是我订阅处理程序的构造函数代码的一部分:

        this.tableExample.MouseDown += new System.Windows.Forms.MouseEventHandler(this.TableExampleMouseDown);
        this.label2.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Label2MouseDown);
        this.panel1.DragDrop += new System.Windows.Forms.DragEventHandler(this.Panel1DragDrop);
        this.panel1.DragEnter += new System.Windows.Forms.DragEventHandler(this.Panel1DragEnter);

1 个答案:

答案 0 :(得分:0)

您似乎忘记订阅MouseDown活动。简单地写一个事件hanlder是不够的。

将它放在Form_Load事件处理程序或表单的构造函数中:

tableExample.MouseDown += new MouseEventHandler(TableExampleMouseDown);

有关更多信息,请参阅文档:How to: Subscribe to and Unsubscribe from Events - Microsoft Docs

修改

也可能是您按下自定义控件的其中一个子控件。子控件有自己的MouseDown个事件。

要使子控件也引发父控件的MouseDown事件,请将其置于自定义控件的构造函数 中:

MouseEventHandler mouseDownHandler = (object msender, MouseEventArgs me) => {
    this.OnMouseDown(me);
};
foreach(Control c in this.Controls) {
    c.MouseDown += mouseDownHandler;
}

编辑2:

根据您添加到问题中的新代码,您似乎忘记订阅panel2的事件:

this.panel2.DragDrop += new System.Windows.Forms.DragEventHandler(this.Panel2DragDrop);
this.panel2.DragEnter += new System.Windows.Forms.DragEventHandler(this.Panel2DragEnter);