Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防止物品掉到自己身上_C#_Winforms_Drag And Drop - Fatal编程技术网

C# 防止物品掉到自己身上

C# 防止物品掉到自己身上,c#,winforms,drag-and-drop,C#,Winforms,Drag And Drop,好的,我在这里第一次尝试拖放功能。我已经放下鼠标,从源代码管理中调用了DoDragDrop 我试图实现的是将帐户从一个MDI子级复制/移动到另一个MDI子级。在我的上下文中,再回到源代码管理是毫无意义的 我正在查看拖动输入,在这里可以提供有关当前效果的信息 我想要的东西应该是这样的: If(eventData.Source != accountList) { eventData.Effect = DragDropEffects.Copy; } 然而,我似乎找不到任何方法来确定数据的源代

好的,我在这里第一次尝试拖放功能。我已经放下鼠标,从源代码管理中调用了DoDragDrop

我试图实现的是将帐户从一个MDI子级复制/移动到另一个MDI子级。在我的上下文中,再回到源代码管理是毫无意义的

我正在查看拖动输入,在这里可以提供有关当前效果的信息

我想要的东西应该是这样的:

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

然而,我似乎找不到任何方法来确定数据的源代码控制。我能想到的唯一一件事就是拥有一个自定义类并在数据中传递它,其中嵌入了源代码控制,或者我缺少了一些明显的东西?

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

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


Drap drop用例在我看来是疯狂的,请确保您也涵盖了从外部应用程序开始拖动的情况,因为您将收到与在应用程序中启动相同的DragEnter和所有其他方法。

在对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");
  ...
}

这就是答案,这是一个非常好的答案。但是你把代码弄乱了一点。该行应为
DragDrop.DoDragDrop(dataObj,DragDropEffects.Copy)