我正在尝试将文件从名为 Locate32 的程序(顺便说一句,这很棒)拖到我的应用程序中。这是发生的事情:
e.Data.GetFormats()
{string[7]}
[0]: "FileDrop"
[1]: "FileNameW"
[2]: "FileName"
[3]: "FileNameMap"
[4]: "FileNameMapW"
[5]: "Shell IDList Array"
[6]: "Shell Object Offsets"
DataFormats.FileDrop
"FileDrop"
e.Data.GetDataPresent(DataFormats.FileDrop)
false
为什么 e.Data.GetDataPresent(DataFormats.FileDrop)
返回 false
,即使 FileDrop 显然是列为“可用”的格式之一?
如果我执行 e.Data.GetData(DataFormats.FileDrop)
,我会得到一堆文件名的列表,这是我应该做的。此外,在 Windows 资源管理器中拖放也能正常工作。
这是我的 DragEnter 处理程序的代码:
private void MyForm_DragEnter(object sender, DragEventArgs e) {
if(e.Data.GetDataPresent(DataFormats.FileDrop)) {
e.Effect = DragDropEffects.Copy;
} else {
e.Effect = DragDropEffects.None;
}
}
最佳答案
你应该看看e.AllowedEffect如果DragDropEffects.Copy
在列表中。
更新
前段时间,我在从 GetDataPresent()
中获取正确的格式时也遇到了一些问题。 .由于这个事实,我只是直接查看了 GetFormats()
提供的列表。对我自己做了。代码是这样的:
private void OnItemDragEnter(object sender, DragEventArgs e)
{
//Get the first format out of the list and try to cast it into the
//desired type.
var list = e.Data.GetData(e.Data.GetFormats()[0]) as IEnumerable<ListViewItem>;
if (list != null)
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
这个简单的解决方案适合我,但您也可以遍历 GetFormats()
数组与 linq 并尝试通过 IEnumerable<T>.OfType<MyType>()
找到您想要的类型或类似的东西。
关于c# - e.Data.GetDataPresent 在 WinForms 拖放处理程序中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850870/