Je suis actuellement complètement déconcerté par le problème que j'ai. J'écris un plug-in pour une autre application qui fournit une API .NET publique. J'ai créé une classe nommée Room
et j'utilise un PropertyGrid pour permettre aux utilisateurs de voir et de modifier les propriétés des instances Room
. Quelques propriétés sont limitées à un ensemble de valeurs standard. Ainsi, j'utilise des TypeDescripteurs personnalisés avec des substitutions GetStandardValues()
pour que la grille de propriété affiche une liste déroulante pour ces propriétés.Objet InvalidCastException de coulée à son propre type
Tout fonctionnait très bien. Je recevais des listes déroulantes, et je pouvais éditer des valeurs sans problème. Pourtant maintenant pour une raison quelconque quand je choisis un Room
le PropertyGrid montre les propriétés avec les descripteurs de type comme boîte noire.
Si je clique sur la boîte, il devient blanc et je reçois un curseur clignotant, mais je ne peux pas saisir quoi que ce soit. Si je puis sélectionner une autre chambre mon programme se bloque à l'exception suivante:
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:
Le dernier élément dans les points de trace de pile à ma méthode BuildingTypeConverter.GetStandardValuesSupported() qui est ci-dessous.
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;
}
}
Maintenant, si je mets un point d'arrêt à la ligne 14 ci-dessus et essayer de déboguer le débogueur ne rompt pas au point d'arrêt. De plus, si j'ajoute du code arbitraire avant le cast, la trace de la pile de l'InvalidCastException semble toujours faire référence à la première ligne de GetStandardValues (), quelle que soit sa nature. Par exemple, j'ai essayé ce qui suit.
public override bool GetStandardValuesSupported(System.ComponentModel.ITypeDescriptorContext context)
{
string s = "hello world"; //FIRST LINE
int i = 0;
Room r = (Room)context.Instance;
.....
J'ai toujours la même InvalidCastException. Pourtant, c'est la trace de pile référence la première ligne ci-dessus où j'initialise string s
. De plus, si j'essayais de définir un point d'arrêt sur cette première ligne, il n'était pas non plus déclenché.
Comme je l'ai déjà dit auparavant était fonctionnait bien il ya un jour ou deux. J'ai même essayé de revenir aux révisions précédentes dans mon dépôt SVN. Je suis allé aussi loin que la première révision où j'ai créé la classe descripteur de type personnalisé, mais toujours rencontrer le problème avec le InvalidCastExceptions
. Est-ce que quelqu'un a une idée de ce qui se passe?
J'ai été récemment déconcerté d'une manière similaire et il s'est avéré être lié à code généré par le concepteur qui s'est levé lorsque j'ai nommé une propriété quelque chose qui a affronté –
Humm intéressant. Pourtant, avec moi, cela ne fonctionne toujours pas, même si je reviens (y compris le code du concepteur) à une version qui fonctionnait. J'ai quelques propriétés avec le même nom que mes classes cependant. –