Question

Actuellement, je suis complètement dérouté par le problème que je vais avoir.Je suis en train d'écrire un plug-in pour une autre application qui fournit au public .NET DE L'API.J'ai créé une classe nommée Room et je suis en utilisant une grille de propriété pour permettre aux utilisateurs de voir et d'éditer les propriétés de la Room les instances.Quelques propriétés sont limités à un ensemble de valeurs standard.Donc je suis en utilisant des TypeDescriptors avec GetStandardValues() remplace pour obtenir la propriété de la grille pour afficher une liste déroulante de ces propriétés.

C'était tout fonctionne très bien.J'ai été faire les menus déroulants, et j'ai pu modifier les valeurs pas de problème.Pourtant, aujourd'hui, pour quelque raison que quand je sélectionne un Room la grille des propriétés affiche les propriétés du type de descripteurs comme une boîte noire.

alt text

Si je clique sur la case devient blanc, et je reçois un curseur clignotant, mais je ne peux pas taper quoi que ce soit.Si je puis sélectionnez une autre Pièce de mon programme se bloque avec 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 de la pile des points de trace de mon BuildingTypeConverter.GetStandardValuesSupported() méthode qui est indiqué 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 j'ai mis un point d'arrêt à la ligne 14 ci-dessus et essayez de déboguer le débogueur ne casse pas au point d'arrêt.En plus, si j'ajoute du code arbitraire avant la fonte de la trace de la pile de la InvalidCastException semble toujours référence à la première ligne de GetStandardValues() indépendamment de ce qu'il est.Pour exemple, j'ai essayé le suivant.

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 le même InvalidCastException.Pourtant, c'est la trace de pile de référence de la première ligne ci-dessus où j'initialise string s.En outre, si j'ai essayé de définir un point d'arrêt sur cette première ligne, il n'est pas déclenché.

Comme je l'ai dit avant ce a fonctionne très bien un jour ou deux auparavant.J'ai même essayé de restauration des révisions précédentes, dans mon dépôt SVN.Je suis allé aussi loin que la première révision ont été, j'ai créé la coutume du Descripteur de Type de classe, mais encore fonctionner dans le problème avec la InvalidCastExceptions.Quelqu'un aurait-il une idée de ce qui se passe?

Était-ce utile?

La solution

Si la trace de la pile indique toujours la même ligne, même après avoir changé le code qui m'indiquent que le ProperyGrid ne fonctionne pas de la même version de l'assembly.Ceci est confirmé quand vous dites que vous mettez un point d'arrêt, mais le point d'arrêt n'est jamais atteint.Si vous exécutez l'intérieur du débogueur de Visual Studio, je vous suggère de regarder la fenêtre de sortie (Ctrl+W, O), qui liste tous les assemblages (avec leur chemin d'accès) qui sont chargés de les exécuter.J'ai vu la version de l'assembly confusion, en particulier lorsque l'assemblée est dans le cas, où il insiste sur le chargement d'une version plus ancienne de l'assemblée.

Autres conseils

Il se peut que les deux types sont en fait différents - par exemple, si l'un d'entre eux est chargé à partir d'une autre version de certains assemblée que l'autre type.Je ne suis pas sûr si cela pourrait se produire dans votre cas, mais ça pourrait être un problème.

La meilleure façon de vérifier cela est de placer un point d'arrêt à l'endroit où l'exception est levée.Ensuite, vous pouvez regarder les deux types de montres ou de fenêtre et de regarder o1.GetType().Assembly. FullName (et de même pour l'autre objet).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top