2

Visual Studio 2010を使用して、拡張機能を開発しています

ツールウィンドウのWPFTreeViewから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として解決されます。これは、それがその種のオブジェクトであることを私に教えてくれます。これは、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はTableから継承します。ブレークポイントを挿入して呼び出すと

  e.Data.GetFormats()

完全修飾TypeNameが表示されます

4

2 に答える 2

1

私はリフレクションを使用してこれを解決することができました:MSDNフォーラム回答

        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 ;
        }
    }
于 2009-09-16T07:37:51.487 に答える
0

私はあなたのコードをテストしていませんが、問題はボクシングとアンボクシングにあると思います。MouseMoveまたはDragDropイベントのタイプが間違っているようです。SqlDataTableを受信する場合は、TableではなくSqlDataTableを送信するか、またはその逆を行う必要があります。GetData()関数は、キャストを実行できる場合はnullを返します。

注:リフレクションを使用してプライベートメンバーを取得することはお勧めできません。彼らがプライベートであるならば、それには理由があります。

于 2014-01-17T21:11:35.243 に答える