我创建了一个由两个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);
答案 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);