e.data.GetData يكون فارغًا دائمًا
-
07-07-2019 - |
سؤال
أنا أعمل مع 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() قيمة فارغة إذا كان بإمكانها إجراء عملية الإرسال.
كملاحظة:ليس من الممارسات الجيدة استخدام الانعكاس لاسترداد الأعضاء الخاصين.إذا كانت خاصة هناك سبب لذلك.