سؤال

أنا حاليا تماما في حيرة من مشكلة أعاني.أنا أكتب المكونات في تطبيق آخر يوفر العامة .NET API.لقد خلق فئة اسمه Room و أنا باستخدام PropertyGrid السماح للمستخدمين رؤية وتحرير خصائص Room حالات.بعض خصائص تقتصر على مجموعة من القيم القياسية.وبالتالي أنا باستخدام مخصص TypeDescriptors مع GetStandardValues() يتجاوز على الممتلكات الشبكة لإظهار القائمة المنسدلة على تلك الخصائص.

هذا كان كل شيء يعمل على ما يرام.لقد كان الحصول على قطرة هبوطا ، و لا يمكن تعديل قيم لا توجد مشكلة.بعد الآن لسبب ما عندما حدد Room على PropertyGrid يظهر خصائص مع نوع واصفات بمثابة الصندوق الأسود.

alt text

إذا كنت انقر على مربع يتحول إلى اللون الأبيض و أنا على رأس مؤشر وامض ، ولكن لا أستطيع كتابة أي شيء.إذا كنت ثم اختر غرفة أخرى بلدي تعطل البرنامج مع الاستثناء التالي:

System.InvalidCastException was caught
  Message=Unable to cast object of type 'DVAMC.Room' to type 'DVAMC.Room'.
  Source=DVAMC
  StackTrace:
       at DVAMC.BuildingTypeConverter.GetStandardValuesSupported(ITypeDescriptorContext context) in C:\Documents and Settings\eric.anastas\My Documents\_SVN WC\DVAMC Working\BuildingTypeConverter.cs:line 14
       at System.Windows.Forms.PropertyGridInternal.GridEntry.get_Flags()
       at System.Windows.Forms.PropertyGridInternal.GridEntry.get_NeedsDropDownButton()
       at System.Windows.Forms.PropertyGridInternal.PropertyDescriptorGridEntry.get_NeedsDropDownButton()
       at System.Windows.Forms.PropertyGridInternal.PropertyGridView.SelectRow(Int32 row)
       at System.Windows.Forms.PropertyGridInternal.PropertyGridView.SelectGridEntry(GridEntry gridEntry, Boolean fPageIn)
       at System.Windows.Forms.PropertyGridInternal.PropertyGridView.GridPositionData.Restore(PropertyGridView gridView)
       at System.Windows.Forms.PropertyGridInternal.PropertyGridView.Refresh(Boolean fullRefresh, Int32 rowStart, Int32 rowEnd)
       at System.Windows.Forms.PropertyGridInternal.PropertyGridView.Refresh()
       at System.Windows.Forms.PropertyGrid.Refresh(Boolean clearCached)
       at System.Windows.Forms.PropertyGrid.set_SelectedObjects(Object[] value)
       at System.Windows.Forms.PropertyGrid.set_SelectedObject(Object value)
       at DVAMC.RoomDetailsForm.set_RoomDetailsSelectedRoom(Room value) in C:\Documents and Settings\eric.anastas\My Documents\_SVN WC\DVAMC Working\RoomDetailsForm.cs:line 115
       at DVAMC.RoomDetailsForm.roomListTreeView_SelectionChanged(Object sender, EventArgs e) in C:\Documents and Settings\eric.anastas\My Documents\_SVN WC\DVAMC Working\RoomDetailsForm.cs:line 159
       at BrightIdeasSoftware.ObjectListView.OnSelectionChanged(EventArgs e)
       at BrightIdeasSoftware.ObjectListView.HandleApplicationIdle(Object sender, EventArgs e)
       at System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FDoIdle(Int32 grfidlef)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.RunDialog(Form form)
       at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
       at System.Windows.Forms.Form.ShowDialog()
       at DVAMC.RoomDetailsCmd.Execute(ExternalCommandData commandData, String& message, ElementSet elements) in C:\Documents and Settings\eric.anastas\My Documents\_SVN WC\DVAMC Working\RoomDetailsCmd.cs:line 44
  InnerException: 

العنصر الأخير في تتبع المكدس نقطة إلى BuildingTypeConverter.GetStandardValuesSupported() الأسلوب الذي هو مبين أدناه.

GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context)
{
    Room r = (Room)context.Instance; //this is line 14 referenced by the InvalidCastException's stack trace

    if (r.IsLinked)
    {
        return true;
    }
    else
    {
        return false;
    }
}

الآن إذا كنت تعيين نقطة توقف في خط 14 أعلاه ومحاولة تصحيح المصحح لا يفطر عند نقطة إيقاف يواجهها.وبالإضافة إلى ذلك, إذا قمت بإضافة قانون تعسفي قبل يلقي تتبع المكدس من InvalidCastException يبدو دائما أن الإشارة إلى أول خط GetStandardValues() بغض النظر عن ما هو عليه.على سبيل المثال حاولت التالية.

public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context)
    {
        string s = "hello world";   //FIRST LINE
        int i = 0;


        Room r = (Room)context.Instance; 

        .....

لا يزال لدي نفس InvalidCastException.ومع ذلك تتبع المكدس الإشارة السطر الأول أعلاه حيث تهيئة string s.بالإضافة, إذا حاولت تعيين نقطة توقف على هذا السطر الأول كما أنه ليس من أثار.

كما قلت من قبل هذا كان يعمل على ما يرام اليوم أو قبل ذلك.وحاولت العودة إلى التنقيحات السابقة في بي إس في مستودع.لقد ذهبت بقدر ما يعود إلى المراجعة الأولى كنت أنا خلقت نوع مخصص واصف الدرجة ولكن لا تزال تعمل في مشكلة مع InvalidCastExceptions.لا أحد لديه أي فكرة ما الذي يحدث ؟

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

المحلول

إذا تتبع المكدس يظهر دائما نفس الخط حتى بعد تغيير التعليمات البرمجية التي تشير إلي أن ProperyGrid لا يعمل نفس الإصدار من الجمعية.هذا هو الأمر عندما يقول لك ضع نقطة توقف ولكن توقف أبدا ضرب.إذا كنت تقوم بتشغيل داخل المصحح Visual Studio أقترح عليك أن ننظر إلى إطار الإخراج (Ctrl+W O) ، والتي سيتم سرد كافة الجمعيات (مع المسار) التي يتم تحميلها في تشغيل.لقد رأيت الجمعية الإصدار الارتباك خاصة عند الجمعية في GAC ، حيث يصر على تحميل نسخة قديمة من الجمعية.

نصائح أخرى

قد يكون من أن هذين النوعين هي في الواقع مختلفة - على سبيل المثال إذا كان واحد منهم هو تحميل آخر نسخة من بعض الجمعية من نوع آخر.لست متأكدا إذا كان هذا يمكن أن يحدث في حالتك ، ولكن يمكن أن يكون مشكلة.

أسهل طريقة للتحقق من ذلك هو وضع نقطة توقف في المكان حيث يتم طرح استثناء.ثم يمكنك إلقاء نظرة على نوعين في الساعات أو الإطار الحالي والنظر في o1.GetType().Assembly. FullName (وبالمثل بالنسبة كائن آخر).

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