2008-09-08 7 views
2

J'essaye d'implémenter Drag & Drop fonctionnalité avec la source étant un contrôle TreeView. Lorsque je lance un glisser sur un nœud, je reçois:Aide de Glisser-déposer TreeView - _Invalid FORMATETC structure_ exception

non valide la structure FORMATETC (Exception de HRESULT: 0x80040064 (DV_E_FORMATETC))

Le gestionnaire ItemDrag (où l'exception a lieu), ressemble :

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

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

Quelqu'un sait-il la cause de ce problème et comment y remédier? (.NET 2.0, Windows XP SP2)

Répondre

1

FORMATETC est un type de presse-papiers d'application, faute d'un meilleur terme. Afin de retirer quelques-unes des astuces visuelles de dragage autour du nœud de l'arbre, il doit être copié dans ce presse-papiers avec sa description de la source. Le contrôle de la source charge ses informations dans le Presse-papiers FORMATETC et l'envoie à l'objet cible. Il semble que l'erreur se produit sur la goutte et non sur le glisser. Le DV dans DV_E_FORMATETC indique généralement les occurrences d'erreur à l'étape de suppression.
La destination n'a pas l'air d'aimer ce que vous y déposez. Le presse-papiers peut être corrompu ou la destination de dépôt peut ne pas être configurée pour le comprendre.

Je vous recommande d'essayer l'une des deux choses suivantes. Supprime l'arborescence d'origine et la destination.

  1. Vider vos DLL. Fermez tout. Ouvrez et placez l'arborescence et la destination sur le formulaire. Il peut avoir été mal formé et ne pas remplir complètement la structure FORMATETC. Essayez une autre arborescence et déposez-y. Si vous tombez sur un autre arbre et que cela fonctionne, vous savez que vos oranges fonctionnent à l'orange et ce n'est pas la vue arborescente. Ce peut être la destination s'il s'agit d'une grille ou d'une liste. Vous devrez peut-être modifier ces structures pour pouvoir recevoir la goutte.

Non que cela aide, mais la structure est quelque chose comme ceci:

typedef struct tagFORMATETC 
{ 
    CLIPFORMAT  cfFormat; 
    DVTARGETDEVICE *ptd; 
    DWORD   dwAspect; 
    LONG   lindex; 
    DWORD   tymed; 
} FORMATETC, *LPFORMATETC; 
+5

Vous avez mal compris la réponse. C'est ainsi que le FORMATETC est construit dans Windows. Le code de la réponse n'est pas une réponse c'est comment l'objet ayant l'erreur est construit. Le presse-papiers n'est pas écrit en C#, il est écrit en C++ et fait partie de Windows. L'erreur est locale à Windows et il n'y a pas de code C# dans cet objet. C'est le code de l'objet ayant l'erreur. Je réponds au texte au-dessus du code. La solution consiste à remplacer les fichiers .DLL par la nouvelle bibliothèque. – Stradas

1

Quand vous faites glisser-déposer avec les commandes de liste et TreeView vous devez vous assurer que vous retirer et insérer correctement la liste des éléments. Par exemple, en utilisant le glisser-déposer impliquant trois contrôles 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); 
      } 
     } 
    } 

vous remarquerez qu'à la fin de l'événement DragDrop je déplaçant la ListViewItem ou la création d'une copie d'un.

2

Au cas où cela aiderait quelqu'un d'autre - J'ai rencontré ce problème avec le WPF TreeView (pas Windows Forms comme indiqué dans la question) et la solution était simplement de marquer l'événement comme manipulé dans le gestionnaire d'événement drop.

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

     e.Handled = true; 
    }