Domanda

Io sto usando un PropertyGrid in un'applicazione che sto scrivendo per consentire agli utenti di visualizzare e modificare le istanze di volte i miei oggetti. A volte l'utente può avere un file aperto in modalità di lettura / scrittura in cui possono apportare modifiche al file attraverso la griglia delle proprietà. In altri casi essi possono avere un file aperto in modalità di sola lettura, e non dovrebbero essere in grado di apportare modifiche agli oggetti attraverso la PropetyGrid. Le mie classi hanno anche proprietà dinamiche, che vengono restituiti mediante l'attuazione di ICustomTypeDescriptor. È per questo che ci tengo a sfruttare la costruito in flessibilità di un controllo PropertyGrid.

Non sembra essere un modo semplice per impostare una struttura a griglia per una modalità di sola lettura. Se disattivo una PropertyGrid questo impedisce inoltre all'utente di scorrimento dell'elenco. Così sto pensando che il modo migliore per farlo è quello di aggiungere ReadOnlyAttributes alle proprietà in fase di esecuzione. C'è qualche altro modo?

È stato utile?

Soluzione

Dal momento che si sta implementando ICustomTypeDescriptor non c'è bisogno di aggiungere eventuali attributi; si può semplicemente ignorare IsReadOnly sul PropertyDescriptor. Sto pensando che dovrebbe essere abbastanza semplice scrivere un tipo di intermediario che imita (via ICustomTypeDescriptor e TypeConverter) un tipo avvolto, ma restituisce sempre casi in sola lettura PropertyDesciptor? Fatemi sapere se volete un esempio (non è banale però).

Si potrebbe anche voler controllare se qualcosa come questo lo offre lo costruì.

Altri suggerimenti

Ho trovato una soluzione molto rapida per thoses che non si preoccupano per il PropertyGrid essere in grigio.

TypeDescriptor.AddAttributes(myObject, new Attribute[]{new ReadOnlyAttribute(true)});
propertyGrid1.SelectedObject = myObject;

Il mio consiglio sarebbe quello di scrivere un controllo personalizzato che eredita dal controllo PropertyGrid, e in quel controllo personalizzato, hanno un valore booleano di sola lettura, e quindi sovrascrivere alcune cose e verificare, se (in sola lettura) quindi annullare l'azione

Mi sono imbattuto in questo. Volevo un controllo che è stato letto solo, ma non in grigio.

Eredita dal controllo griglia delle proprietà e creare la propria lettura unica versione aggiungendo il seguente codice per ignorare le pressioni dei tasti

#Region "Non-greyed read only support"

Private isReadOnly As Boolean
Public Property [ReadOnly]() As Boolean
    Get
        Return Me.isReadOnly
    End Get
    Set(ByVal value As Boolean)
        Me.isReadOnly = value
    End Set
End Property


Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
    If Me.isReadOnly Then Return True
    Return MyBase.ProcessDialogKey(keyData)
End Function

Public Function PreFilterMessage(ByRef m As Message) As Boolean
    If m.Msg = &H204 Then 'WM_RBUTTONDOWN
        If Me.isReadOnly Then Return True
    End If
    Return False
End Function
#End Region
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top