2017-08-07 105 views
0

我创建了一个由两个pictureBoxes和两个标签组成的控件(称为Table)。拖放在自定义控件C#

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

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); 
+0

所以放置[** **断点(https://msdn.microsoft.com/en-us/library/5557y8b4.aspx)在'MouseDown',看看它是否会被触发或不。 –

+0

我试过了,我看到它不会触发...相反,如果我在标准控件(如TextBox)上执行相同的操作,则它正确工作... – Pietro

+0

因此,您似乎并未订阅事件...请参阅下面的答案。 –

回答

0

你似乎已经忘了订阅MouseDown事件。仅仅写一个事件hanlder是不够的。

在事件处理程序或窗体的构造将这个:

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:

基础的对于您添加到问题中的新代码,您似乎忘记订阅的事件:

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

好的,谢谢。这可能是一个分心错误。无论如何,MouseDown事件触发,但DragEnter和DragDrop仍然不会。或者更好的是,如果我在panel2上拖放一个标签,它们就可以正常工作,但是当我尝试拖动tableExample时,仍然没有任何东西... – Pietro

+0

@Pietro:你能在你的问题中分享更多的代码吗?例如窗体构造函数,以便我们可以看到您订阅哪些事件。 –

+0

我用更多的代码编辑了我的问题。谢谢 – Pietro