2009-09-14 126 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。

注意:使用反射来检索私有成员不是一个好习惯。如果他们是私人的,这是有原因的。