سؤال

أنا أعمل مع Visual Studio 2010 لتطوير ملحق

أحتاج إلى السحب والإسقاط من 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.هذا من شأنه أن يخبرني أنه هذا النوع من الكائنات.هذا ما هو موجود في عرض شجرة 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 المؤهل بالكامل

هل كانت مفيدة؟

المحلول

ولقد كنت قادرا على حل هذا التفكير باستخدام: <لأ href = "http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/67f2e945-a798-484a-b918-cda1e71699aa" يختلط = "نوفولو noreferrer" عنوان = "المنتدى MSDN الإجابة"> المنتدى 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 ;
        }
    }

نصائح أخرى

لم أختبر الكود الخاص بك ولكن أعتقد أن المشكلة تكمن في الملاكمة والفتح.يبدو أن لديك النوع الخاطئ في حدث MouseMove أو DragDrop.إذا كنت ترغب في تلقي SqlDataTable يجب عليك إرسال SqlDataTable وليس Table، أو العكس.ستُرجع الدالة GetData() قيمة فارغة إذا كان بإمكانها إجراء عملية الإرسال.

كملاحظة:ليس من الممارسات الجيدة استخدام الانعكاس لاسترداد الأعضاء الخاصين.إذا كانت خاصة هناك سبب لذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top