Я в настоящее время полностью сбит с толку проблемой, с которой я столкнулся. Я пишу плагин для другого приложения, которое предоставляет общедоступный .NET API. Я создал класс с именем Room
и использую PropertyGrid, чтобы пользователи могли видеть и редактировать свойства экземпляров Room
. Некоторые свойства ограничены набором стандартных значений. Поэтому я использую пользовательские TypeDescriptors с переопределениями GetStandardValues()
, чтобы сетка свойств показывала раскрывающийся список для этих свойств.
Это все работало просто отлично. Я получал выпадающие списки, и я мог редактировать значения без проблем. Тем не менее, по какой-то причине, когда я выбираю Room
, PropertyGrid показывает свойства с дескрипторами типа в виде черного ящика.
![alt text](https://i.stack.imgur.com/ifP7M.jpg)
Если я нажму на поле, оно станет белым, и у меня появится мигающий курсор, но я ничего не могу напечатать. Если я затем выберу другую комнату, моя программа аварийно завершит работу со следующим исключением:
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
. Кроме того, если бы я попытался установить точку останова в этой первой строке, она также не сработала.
Как я уже говорил, работало очень хорошо день или около того назад. Я даже попытался откатиться к предыдущим версиям в моем репозитории SVN. Я вернулся еще в первой ревизии, когда создал собственный класс дескриптора типа, но все еще сталкиваюсь с проблемой с InvalidCastExceptions
. Кто-нибудь знает, что происходит?