السحب عبر العملية وإسقاط نوع الكائن المخصص في winforms c#

StackOverflow https://stackoverflow.com/questions/2106213

سؤال

هذا السؤال قريب مما يهمني ، ولكن ليس تمامًا.

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

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