e.Data.GetDataPresent无法在WinForms拖放处理程序中运行?

时间:2010-05-17 16:31:30

标签: 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;
    }
}

2 个答案:

答案 0 :(得分:2)

如果DragDropEffects.Copy在列表中,您应该查看e.AllowedEffect

更新

前段时间我在从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;
    }
}

这个简单的解决方案适用于我,但您也可以使用linq遍历GetFormats()数组,并尝试通过IEnumerable<T>.OfType<MyType>()或类似内容找到所需的类型。

答案 1 :(得分:0)

除非有人能告诉我为什么这是一个坏主意,否则我将采用以下方式:

private void MyForm_DragEnter(object sender, DragEventArgs e) {
    e.Effect = (e.Data.GetFormats().Any(f => f == DataFormats.FileDrop)
        ? DragDropEffects.Copy
        : DragDropEffects.None);
}

从Windows资源管理器和Locate32都可以使用。