Domanda

Attualmente sono completamente sconcertato da il problema che sto avendo.Sto scrivendo un plug-in per un'altra applicazione che fornisce una pubblica .NET API.Ho creato una classe chiamata Room e sto usando un PropertyGrid per consentire agli utenti di visualizzare e modificare le proprietà del Room le istanze.Alcune proprietà sono limitate a un insieme di valori standard.Così sto usando personalizzato TypeDescriptors con GetStandardValues() sostituzioni per ottenere la proprietà griglia per visualizzare un menu a discesa per le proprietà.

Questo era tutto funziona bene.Mi è stato sempre a tendina, e ho potuto modificare i valori nessun problema.Ma adesso, per qualche ragione, quando si seleziona un Room il PropertyGrid mostra le proprietà con il tipo di descrittori come una scatola nera.

alt text

Se faccio clic sulla casella diventa bianco e un cursore lampeggiante, ma io non riesco a digitare nulla.Se poi selezionare un'altra Stanza, il mio programma si blocca con la seguente eccezione:

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: 

L'ultimo elemento nella pila punti di traccia per il mio BuildingTypeConverter.GetStandardValuesSupported() metodo che viene mostrato di seguito.

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

Ora se ho impostato un breakpoint alla riga 14 e tenta di eseguire il debug il debugger non rompere il punto di interruzione.Inoltre, se posso aggiungere codice arbitrario prima che il cast dello stack trace dal InvalidCastException sembra sempre riferimento alla prima linea di GetStandardValues (), a prescindere di cosa si tratta.Per esempio ho provato il seguente.

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


        Room r = (Room)context.Instance; 

        .....

Ho ancora lo stesso InvalidCastException.Eppure è traccia di stack di riferimento con la prima riga dove ho inizializzare string s.In addtion, se ho cercato di impostare un punto di interruzione sulla prima riga e ' stato anche attivato.

Come ho detto prima questo era lavorando bene un giorno o così fa.Ho anche provato a ripristinare le precedenti revisioni nel mio repository SVN.Sono andato fino alla prima revisione sono stati ho creato il custom Tipo di Descrittore di classe, ma ancora avere il problema con la InvalidCastExceptions.Qualcuno ha qualche idea di cosa sta succedendo?

È stato utile?

Soluzione

Se lo stack trace mostra sempre la stessa linea anche dopo aver cambiato il codice che indica a me che il ProperyGrid non è in esecuzione la stessa versione dell'assembly.Questo è ulteriormente confermato quando dici di mettere un punto di interruzione, ma il punto di interruzione non è mai successo.Se si esegue all'interno del debugger di Visual Studio ti suggerisco di guardare la finestra di uscita (Ctrl+W, O), il quale fornirà un elenco di tutte le assemblee (con il loro percorso) che vengono caricati nella corsa.Ho visto la versione dell'assembly confusione soprattutto quando l'assembly nella global assembly cache, dove insistere dopo il caricamento di una versione precedente dell'assemblea.

Altri suggerimenti

Può essere che i due tipi sono in realtà diverse - per esempio, se uno di loro è caricato di un'altra versione di un po ' di assemblaggio di altro tipo.Io non sono molto sicuro se questo potrebbe accadere nel tuo caso, ma potrebbe essere un problema.

Il modo più semplice per verificare questo è quello di posizionare il punto di interruzione nel luogo in cui viene generata l'eccezione.Poi si può guardare i due tipi di orologi o finestra immediata e guardare o1.GetType().Assembly. FullName (e, analogamente, per l'altro oggetto).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top