代码之家  ›  专栏  ›  技术社区  ›  We Are All Monica

e.data.getdatapresent不在WinForms拖放处理程序中工作?

  •  2
  • We Are All Monica  · 技术社区  · 16 年前

    我正试图将文件从一个名为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 回复  |  直到 16 年前
        1
  •  2
  •   Oliver    16 年前

    你应该看看 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;
        }
    }
    

    这个简单的解决方案对我有效,但是你也可以在 GETFalm() 用LINQ数组并尝试通过 IEnumerable<T>.OfType<MyType>() 或者类似的东西。

        2
  •  0
  •   We Are All Monica    16 年前

    除非有人能告诉我这是个坏主意的原因,否则我要说的是:

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

    可在Windows资源管理器和locate32中使用。

    推荐文章