【问题标题】:Drag And Drop on Customized Control C#拖放自定义控件 C#
【发布时间】:2017-08-07 09:27:09
【问题描述】:

我创建了一个由两个图片框和两个标签组成的控件(称为表格)。

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

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

【问题讨论】:

  • 所以在MouseDown 中放置一个breakpoint 看看它是否会触发。
  • 我试过了,发现它没有触发...相反,如果我在 TextBox 等标准控件上执行相同的操作,它可以正常工作...
  • 所以您似乎并没有真正订阅该活动......请参阅下面的答案。
  • 您实际点击这些 pbox 或标签之一的几率是多少?这会触发 他们的 MouseDown 事件,而不是 UserControl 的。您必须通过为这些控件订阅所有 MouseDown 事件并调用 this.OnMouseDown() 来解决此问题。绘制一个吸引用户单击以开始拖动的字形将是明智的。对于面板来说也是如此,当您向其添加控件时,其事件触发的几率会降低。请注意,您在错误的控件上设置了 AllowDrop,“panel1”似乎与名为“Panel2”的控件的事件没有太大关系。
  • 查看我的回答更新。

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


【解决方案1】:

您似乎忘记订阅MouseDown 事件。仅仅编写一个事件处理程序是不够的。

把它放在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);

【讨论】:

  • 好的,谢谢。这可能是一个分心错误。无论如何,现在 MouseDown 事件触发了,但 DragEnter 和 DragDrop 仍然没有。或者更好的是,如果我在 panel2 上拖放标签,它们可以正常工作,但是当我尝试拖动 tableExample 时,仍然没有...
  • @Pietro :您能在您的问题中分享更多代码吗?例如表单构造函数,这样我们就可以看到您订阅了哪些事件。
  • 无论如何,现在它可以工作了,这要归功于你说我要添加的内容。非常感谢!!
  • @Pietro :如果我的回答解决了您的问题,请按我帖子左侧的勾号/复选标记将其标记为“已接受”。 -- 更多信息见:How does accepting an answer work?
  • 我做到了。我还有一个小问题......同样通过使用 DragDropEffects.Copy,我的控件从源中删除。和Move没有区别吗??谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 2019-06-10
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多