e.Data.GetDataPresent не работает в обработчике перетаскивания WinForms? - PullRequest
2 голосов
/ 17 мая 2010

Я пытаюсь перетащить файлы в свое приложение из программы под названием 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 ]

2 голосов
/ 18 мая 2010

Вы должны взглянуть на 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>() или какому-то подобному.

0 голосов
/ 18 мая 2010

Если кто-то не скажет мне, почему это плохая идея, вот что я собираюсь сделать:

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

Работает из Windows Explorer и Locate32.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...