Pregunta

Actualmente estoy completamente desconcertado por el problema que estoy teniendo. Estoy escribiendo un plug-in para otra aplicación que proporciona una API .NET pública. He creado una clase llamada Room y estoy usando un PropertyGrid para permitir a los usuarios ver y editar las propiedades de los casos Room. Unas pocas propiedades están restringidas a un conjunto de valores estándar. Por lo tanto estoy usando TypeDescriptors personalizados con anulaciones GetStandardValues() para obtener la cuadrícula de propiedades para mostrar un menú desplegable para esas propiedades.

Esto fue todo muy bien trabajando. Me estaba menús desplegables, y pude editar los valores no hay problema. Sin embargo, ahora, por alguna razón cuando selecciono un Room la PropertyGrid muestra las propiedades con los descriptores de tipo como un cuadro negro.

text alt

Si hago clic en el cuadro que se ponga blanco y consigo un cursor parpadeante, sin embargo, no puede escribir nada. Si a continuación, selecciono a otra habitación mi programa se bloquea con la siguiente excepción:

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: 

El último elemento de los puntos de seguimiento de la pila a mi método BuildingTypeConverter.GetStandardValuesSupported () que se muestra a continuación.

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;
    }
}

Ahora si me puse un punto de interrupción en la línea 14 anterior y tratar de depurar el depurador no se rompe en el punto de interrupción. Además, si agrego código arbitrario antes de la fundición del seguimiento de la pila de la InvalidCastException siempre parece hacer referencia a la primera línea de GetStandardValues ??() independientemente de lo que es. Por ejemplo He intentado lo siguiente.

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


        Room r = (Room)context.Instance; 

        .....

Todavía tengo la misma InvalidCastException. Sin embargo, es pila referencia traza la primera línea por encima de donde yo inicializar string s. En voluminoso, si trataba de establecer un punto de interrupción en esta primera línea tampoco fue disparado.

Como he dicho antes de este era trabajando muy bien un día o así lo hace. Incluso he intentado hacer retroceder a las revisiones anteriores en mi repositorio SVN. He ido tan lejos como fuera la primera revisión he creado la costumbre de clase descriptor de tipo, pero aún con el problema con el InvalidCastExceptions. ¿Alguien tiene alguna idea de lo que está pasando?

¿Fue útil?

Solución

Si el seguimiento de la pila siempre muestra la misma línea, incluso después de que haya cambiado el código que indicaría a mí que el ProperyGrid no se está ejecutando la misma versión de la asamblea. Esto se ve confirmado cuando se dice que puso un punto de ruptura, pero el punto de interrupción no se ve afectado. Si está ejecutando en el interior del depurador de Visual Studio Sugiero que nos fijamos en la ventana de salida (Ctrl + W, O), que mostrará una lista de todos los conjuntos (con su ruta) que se cargan en el período previo. He visto montaje versión confusión particularmente cuando es el ensamblado en la GAC, donde insistir en la carga de una versión más antigua del conjunto.

Otros consejos

Puede ser que los dos tipos son en realidad diferente - por ejemplo, si uno de ellos está cargado a partir de otra versión de un poco de montaje que el otro tipo. No estoy muy seguro de si esto podría suceder en su caso, pero podría ser un problema.

La forma más sencilla de comprobar esto es colocar punto de interrupción en el lugar donde se produce la excepción. A continuación se puede ver en los dos tipos de relojes o ventana inmediata y vistazo a o1.GetType().Assembly. FullName (y lo mismo para el otro objeto).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top