2009-09-14 128 views
2

我與Visual Studio 2010的工作,開發一個擴展e.data.GetData總是空

我需要將它從一個WPF的TreeView的工具窗口拖放到DSL圖,但是當我打電話e.data .GetData我無法獲得價值並想知道我在做什麼錯誤

private void OnDragDrop(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(typeof(SqlServerTable))) 
     { 
      try 
      { 
       SqlServerTable table = (SqlServerTable)e.Data.GetData(typeof(SqlServerTable)); 
       MessageBox.Show(table.Name); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 

第一個if語句解析爲True。這會告訴我這就是那種Object。 這就是在WPF樹視圖:

 private void DataSourceExplorerTreeView_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      if (DataSourceExplorerTreeView.SelectedValue is TableViewModel) 
      { 
       Table table = ((TableViewModel)DataSourceExplorerTreeView.SelectedValue).Table; 
       DragDrop.DoDragDrop(DataSourceExplorerTreeView, table, DragDropEffects.Copy); 
      } 
     } 
    } 

從表SqlServerTable繼承。如果我堅持一個斷點,並呼籲

e.Data.GetFormats() 

我可以看到我的完全合格的類型名

+0

如果將其更改爲「Object table = e.Data.GetData(typeof(SqlServerTable));」 ? – SwDevMan81 2009-09-14 17:18:36

+0

不幸的是,如果我將e.Data.GetData(typeof(SqlServerTable))粘貼到快速視圖中,它現在總是爲空 – 2009-09-14 17:28:46

回答

1

我已經能夠解決這個使用反射:MSDN Forum Answer

 private void OnDragDrop(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(typeof(SqlServerTable))) 
     { 
      FieldInfo info; 

      object obj; 

      info = e.Data.GetType().GetField("innerData", BindingFlags.NonPublic | BindingFlags.Instance); 

      obj = info.GetValue(e.Data); 

      info = obj.GetType().GetField("innerData", BindingFlags.NonPublic | BindingFlags.Instance); 

     System.Windows.DataObject dataObj = info.GetValue(obj) as System.Windows.DataObject; 

     SqlServerTable table = dataObj.GetData("Project.SqlServerTable") as SqlServerTable ; 
     } 
    } 
+0

,誰能解釋爲什麼對於這樣明顯的功能來說這很困難?爲什麼這些字段是非公開的?!? – RichardJohnn 2012-03-23 13:30:33

0

我沒有測試你的代碼但我認爲問題在於拳擊和拆箱。看起來你在MouseMove或DragDrop事件中有錯誤的類型。如果你想接收SqlDataTable,你應該發送SqlDataTable而不是Table,反之亦然。如果GetData()函數可以執行強制轉換,則它將返回null。

注意:使用反射來檢索私有成員不是一個好習慣。如果他們是私人的,這是有原因的。