السحب عبر العملية وإسقاط نوع الكائن المخصص في winforms c#
-
21-09-2019 - |
سؤال
هذا السؤال قريب مما يهمني ، ولكن ليس تمامًا.
لدي تطبيق .net winforms مكتوب في C#. انا املك ListView
التحكم الذي يعرض مجموعة من كائنات C#. لقد قمت بتوصيله حتى تتمكن من سحب/إسقاط عناصر ListView هذه إلى نموذج مختلف في نفس التطبيق ، ويمرر مجموعة الكائنات بشكل صحيح (اكتب Session
) إلى معالج الإسقاط لهذا النموذج الآخر.
ومع ذلك ، أريد الآن دعم عملية السحب/إسقاط العملية حيث أقوم بتشغيل مثيلات متعددة من طلبي. هذه يبدو أنه سيعمل (على سبيل المثال GetDataPresent
ينجح) ، ولكن في النهاية يلقي استثناء عندما أحاول بالفعل استرداد البيانات- لا يمكن الإلقاء object[]
ل Session[]
.
if (e.Data.GetDataPresent("Fiddler.Session[]"))
{
Session[] oDroppedSessions;
try
{
oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]");
}
catch (Exception eX)
{ // reaches here
}
}
أي شخص يعرف إذا كنت يجب ينفذ ISerializable
لأشياء بلدي من أجل جعل هذا العمل؟ عادة ، سأحاول ببساطة ، ولكن التنفيذ ISerializable
لأن هذا الفصل سيكون غير تميز ، وأنا قلق من وجود آثار جانبية غريبة للقيام بذلك.
تحديث: تنفيذ ISerializable
لا يساعد- الطريقة لا تسمى أبدًا. وبالمثل ، إضافة Serializable
السمة إلى الفصل ليس له أي تأثير على الإطلاق. أي أفكار أخرى؟
المحلول
أنت تعبر حدود العملية ، مراجع الكائنات غير صالحة في عملية أخرى. تدعم فئة DataObject الكائنات التسلسلية للحصول عليها عبر الحائط ، فهي تستخدم ثنائية الشكل. لذا ، نعم ، ستحتاج إلى تطبيق السمة [Serializable] على فصلك والتأكد من أن كائناتك يمكن أن تتسلل/تسلسل بشكل صحيح.
نصائح أخرى
حسنًا ، هذه لقطة ، بدلاً من استخدام مجموعة كاملة من الجلسات ، حاول القيام بذلك بشكل فردي مثل هذا ...
Session[] oDroppedSessions; try { if (e.Data.GetData("Fiddler.Session[]") != null){ object[] objs = e.Data.GetData("Fiddler.Session[]"); if (objs != null && objs.Length > 1){ oDroppedSessions = new Session[objs.Length]; int nIndex = 0; foreach(object obj in objs){ if (obj is Session){ oDroppedSessions[nIndex] = (Session)obj; nIndex++; } } } } } catch (Exception eX) { // reaches here }
تستحق لقطة ، بخلاف إطلاق النار على نفسي لأنني لا أفهم جزء الجلسة تمامًا ، جربها ...
أتمنى أن يساعد هذا ، مع أطيب التحيات ، توم.
يمكنك استخدام "كـ" للبث الذي سيتجنب الاستثناء ("كما سيعود" NULL "دون إلقاء استثناء إذا فشل فريق الممثلين) - لكنني لا أعتقد أن هذا سيحل مشكلتك (سيتجنب فقط الفعلي استثناء) ، كما أوافق ، من المحتمل أن تضطر إلى جعل صفك قابلة للتسلسل. يمكنك اختبار فرضيتك من خلال التعليق على الحقول التي سيكون من الصعب جعلها تعمل - لمجرد اختبارها.