防止将物品丢弃到自己身上

时间:2013-02-03 17:39:32

标签: c# winforms drag-and-drop

好的,所以我在这里第一次尝试拖放功能。我已经处理了鼠标并从源代码控制中调用了DoDragDrop。

我想要实现的是将帐户从一个MDI子项复制/移动到另一个MDI子项。在我的上下文中,没有任何意义可以回到源代码控制上。

我正在查看拖动输入,您可以在其中提供有关当前效果的信息。

我想要的东西如下所示:

If(eventData.Source != accountList)
{
    eventData.Effect = DragDropEffects.Copy;
}

但是,我似乎找不到任何确定数据源控制的方法。我唯一能想到的就是拥有一个自定义类并将数据传递给嵌入其中的源代码控制,或者我错过了一些明显的东西?

2 个答案:

答案 0 :(得分:1)

这是WPF吗?如果是,则可以使用传递给方法的事件的OriginalSource属性,因为它应该映射到调用DoDragDrop方法时传递的源。

如果您使用的是Windows窗体,则在开始操作时无法传递自己的源代码,因此最好的方法是使用自定义数据附加您创建的IDataObject,并根据该源确定源。

Drap-drop用例在我看来很疯狂,请确保您还要涵盖从外部应用程序开始拖动的情况,因为您将收到相同的DragEnter和所有其他方法,就好像您已在应用程序中启动它一样

答案 1 :(得分:1)

在对DoDragDrop的调用中,将对象添加为额外格式:

 var dragSource = this;
 var data = "Hello";

 var dataObj = new DataObject(data);
 dataObj.SetData("DragSource", dragSource);
 DragDrop.DoDragDrop(dragSource, dataObj, DragDropEffects.Copy);

现在在OnDrag处理程序中很容易获得拖动源:

protected override void OnDrop(DragEventArgs e)
{
  var data = e.Data.GetData(DataFormats.Text);
  var dragSource = e.Data.GetData("DragSource");
  ...
}