2008-09-08 15 views
2

ドラッグを実装しようとしています&ソースがTreeViewコントロールであるドロップ機能。私は、ノード上でドラッグを開始すると、私は取得しています:TreeViewドラッグアンドドロップヘルプ - 無効なFORMATETC構造体例外

無効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)

答えて

1

FORMATETCは、より良い用語がないため、アプリケーションクリップボードの種類です。ツリーノードの周りに潜むビジュアルトリックのいくつかを取り除くためには、ソース記述を使ってこのクリップボードにコピーする必要があります。ソースコントロールは、その情報をFORMATETCクリップボードにロードし、それをターゲットオブジェクトに送信します。ドロップではなくドラッグでエラーが発生したようです。 DVDV_E_FORMATETC)は、通常、ドロップステップでエラーが発生したことを示します。
目的地は、あなたがそれをドロップしているものが好きなようには見えません。クリップボードが破損しているか、ドロップ先がそれを理解するように設定されていない可能性があります。

私は2つのうちの1つを試してみることをお勧めします。

  1. 元のツリー構造と宛先を削除します。あなたのDLLをダンプします。すべてを閉じます。開いてツリービューと宛先をフォームに戻します。これは、形成が不十分であり、FORMATETC構造を完全に占有していない可能性があります。
  2. 別のツリービューを配置して、それをドロップしてみてください。あなたが別の木に落として、それが動作するなら、あなたはオレンジ色のあなたのオレンジを知っていて、それはツリービューではありません。それがグリッドまたはリストビューの場合、宛先である可能性があります。ドロップを受け取るには、それらの構造を変更する必要があります。

ないことができますが、構造はこのようなものであること:

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

あなたはその答えを誤解しました。これはFORMATETCがウィンドウでどのように構築されるかです。答えのコードは、エラーを持つオブジェクトがどのように構築されているかの答えではありません。クリップボードはC#で書かれていませんが、C++で書かれており、ウィンドウの一部です。このエラーはウィンドウにローカルであり、そのオブジェクトにはC#コードはありません。これはエラーのあるオブジェクトのコードです。私は答えはコードの上にあるテキストです。解決策は、.DLLを新しいライブラリに置き換えることです。 – Stradas

1

はドラッグをやって、あなたが削除すると正しくリスト項目を挿入することを確認する必要があり、リストとツリービューコントロールをドロップします。たとえば、ドラッグを使用し、3つの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つのコピーを作成していますので注意します。

2

私はこの問題をWPF TreeView(質問に記載されているWindowsフォームではありません)に遭遇しました。解決策は、単にイベントをドロップイベントハンドラで処理されたものとしてマークすることでした。

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

     e.Handled = true; 
    } 
関連する問題