e.data.GetData всегда нулевой - PullRequest
       33

e.data.GetData всегда нулевой

2 голосов
/ 14 сентября 2009

Я работаю с Visual Studio 2010, разрабатываю расширение

Мне нужно перетащить из дерева WPF из окна инструментов в окне инструментов на диаграмму 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 наследуется от таблицы. Если я вставлю точку останова и позвоню

  e.Data.GetFormats()

Я вижу мое полное имя TypeName

Ответы [ 2 ]

1 голос
/ 16 сентября 2009

Мне удалось решить эту проблему с помощью отражения: 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 голосов
/ 18 января 2014

Я не проверял ваш код, но я думаю, что проблема в упаковке и распаковке. Кажется, у вас неправильный тип в событии MouseMove или DragDrop. Если вы хотите получить SqlDataTable, вы должны отправить SqlDataTable не Table, или наоборот. Функция GetData () вернет ноль, если сможет выполнить приведение.

Примечание. Не рекомендуется использовать рефлексию для извлечения приватных членов. Если они частные, то для этого есть причина.

...