c# - e.Data.GetDataPresent 在 WinForms 拖放处理程序中不起作用?

标签 c# winforms drag-and-drop

我正在尝试将文件从名为 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/

相关文章:

javascript - ExtJS 拖放中的动态复制

c# - 如何绑定(bind)位于隔离存储中的图像

c# - 添加获取设置DatagridViewTextBoxCell

c# - C#中List<>对象一次可以保存多少条记录

winforms - F# 脚本执行后立即结束 (FSI)

drag-and-drop - 使用Ember.js拖放

c# - C#中按输出和按引用传递参数有什么区别

c# - 根据系统状态以不同方式处理控制事件

c# - 删除datagridview标题中的排序箭头并将文本放在框的中央

qt+pyqt 发出两次丢弃的 URL