readonly PropertyGrid
-
22-09-2019 - |
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?
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