TreeView Drag & Drop help - _Неверная структура FORMATETC_ исключение - PullRequest
3 голосов
/ 08 сентября 2008

Я пытаюсь реализовать функциональность Drag & Drop с источником, являющимся элементом управления TreeView. Когда я инициирую перетаскивание на узле, я получаю:

Неверная структура FORMATETC (исключение из HRESULT: 0x80040064 (DV_E_FORMATETC))

Обработчик ItemDrag (где происходит исключение), выглядит следующим образом:

private void treeView_ItemDrag(object sender,
        System.Windows.Forms.ItemDragEventArgs e)
{

        this.DoDragDrop(e.Item, DragDropEffects.Move);
}

Кто-нибудь знает причину этого и как это исправить? (.NET 2.0, Windows XP SP2)

Ответы [ 3 ]

2 голосов
/ 12 мая 2012

В случае, если это поможет кому-то еще - я столкнулся с этой проблемой с WPF TreeView (не Windows Forms, как указано в вопросе), и решение было просто убедиться, что событие помечено как обработанное в обработчике события отбрасывания. *

    private void OnDrop(object sender, DragEventArgs e)
    {
        // Other logic...

        e.Handled = true;
    }
1 голос
/ 22 августа 2009

При перетаскивании со списком и древовидными элементами управления вы должны убедиться, что вы удаляете и вставляете элементы списка правильно. Например, используя перетаскивание с использованием трех элементов управления ListView:

    private void triggerInstanceList_DragOver(object sender, DragEventArgs e)
    {
        SetDropEffect(e);
    }

    private void triggerInstanceList_DragEnter(object sender, DragEventArgs e)
    {
        SetDropEffect(e);
    }

    private void SetDropEffect(DragEventArgs e)
    {
        if (e.Data.GetDataPresent(typeof(ListViewItem)))
        {
            ListViewItem itemToDrop = e.Data.GetData(typeof(ListViewItem)) as ListViewItem;
            if (itemToDrop.Tag is TriggerTypeIdentifier)
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.Move;
        }
        else
            e.Effect = DragDropEffects.None;
    }

    private void triggerInstanceList_DragDrop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(typeof(ListViewItem)))
        {
            try
            {
                ListViewItem itemToDrop = e.Data.GetData(typeof(ListViewItem)) as ListViewItem;
                if (itemToDrop.Tag is TriggerTypeIdentifier)
                {
                    ListViewItem newItem = new ListViewItem("<new " + itemToDrop.Text + ">", itemToDrop.ImageIndex);
                    _triggerInstanceList.Items.Add(newItem);
                }
                else
                {
                    _expiredTriggers.Items.Remove(itemToDrop);
                    _triggerInstanceList.Items.Add(itemToDrop);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
        }
    }

вы заметите, что в конце события DragDrop я либо перемещаю ListViewItem, либо создаю его копию.

1 голос
/ 09 сентября 2008

FORMATETC - это тип буфера обмена приложения, из-за отсутствия лучшего термина. Чтобы выполнить некоторые визуальные приемы перетаскивания вокруг узла дерева, его необходимо скопировать в этот буфер обмена с описанием источника. Исходный элемент управления загружает свою информацию в буфер обмена FORMATETC и отправляет ее целевому объекту. Похоже, ошибка возникает при перетаскивании, а не при перетаскивании. DV в DV_E_FORMATETC обычно указывает на ошибку, возникающую на этапе удаления.
Пункт назначения не выглядит так, как будто ему нравится то, что вы на него бросаете. Буфер обмена может быть поврежден или пункт назначения может быть не настроен для его понимания.

Я рекомендую вам попробовать одну из двух вещей.

  1. Удалить исходную древовидную структуру и пункт назначения. Дамп свои дллс. Закройте все Откройте и поместите вид дерева и место назначения обратно в форму. Возможно, он только что сформирован плохо и не полностью заполняет структуру FORMATETC.
  2. Попробуйте добавить другое дерево и перейти к нему. Если вы переходите на другое дерево, и оно работает, вы знаете, что ваши апельсины работают на апельсины, а это не дерево. Это может быть пункт назначения, если это сетка или список. Возможно, вам придется изменить эти структуры, чтобы иметь возможность получать падение.

Не то чтобы это помогло, но структура примерно такая:

typedef struct tagFORMATETC
{
  CLIPFORMAT      cfFormat;
  DVTARGETDEVICE  *ptd;
  DWORD           dwAspect;
  LONG            lindex;
  DWORD           tymed;
} FORMATETC, *LPFORMATETC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...