J'utilise un PROPRIÉTHGRID dans une application J'écris pour permettre aux utilisateurs de voir et de modifier parfois des instances de mes objets. Parfois, l'utilisateur peut avoir un fichier ouvert en mode lecture / écriture où ils peuvent modifier le fichier via la grille de propriété. Dans d'autres cas, ils peuvent avoir un fichier ouvert en lecture en lecture seule et ne devrait pas être en mesure de modifier les objets via PropetyGrid. Mes classes ont également des propriétés dynamiques qui sont renvoyées en implémentant IpetomTypeScriptor. C'est pourquoi je veux vraiment profiter de la flexibilité intégrée d'un contrôle de propriétéGridrid. P>
Il ne semble pas que ce soit un moyen facile de définir une grille de propriété à un mode en lecture seule. Si je désactive un PropertyGrid, cela empêche également l'utilisateur de faire défiler la liste. Donc, je pense que la meilleure façon de le faire est d'ajouter ReadonlyAttributes aux propriétés à l'heure d'exécution. Y a-t-il une autre façon? P>
5 Réponses :
Mon conseil serait d'écrire un contrôle personnalisé qui hérite du contrôle de propriétéGrid et, dans ce contrôle personnalisé, a une valeur booléenne de manière réadonnée, puis remplace certaines choses et vérifiez, si (readonly) puis annule l'action p>
Étant donné que vous implémentez Vous voudrez peut-être aussi vérifier si quelque chose comme celui-ci offre qu'il l'a construit. P> iCustomTypeScriptor code> Il n'est pas nécessaire d'ajouter des attributs; Vous pouvez simplement remplacer
iSreadonly code> sur le matérialité
ImpéritéDescriptor code>. Je pense que cela devrait être assez simple d'écrire un type intermédiaire qui imitat (via
iCustomtypedescriptor code> et
typecotverter code>) un type emballé mais retourne toujours réadonnement
PropertyDesipTor code > Instances? Faites-moi savoir si vous voulez un exemple (ce n'est pas trivial em> si). P>
Ouais c'est ce que je pensais mais j'espérais que leur était un moyen plus facile. Le vrai problème est parfois que ma classe est en lecture seule et d'autres fois, ce n'est pas le cas. Plutôt que de créer un type de wrapper en lecture séparé Quoi de simplement ajouter une propriété booléenne au type de base que iCustomTypedescriptor.geproperties () vérifie si elle devrait être modifiée ou en lecture seule?
J'ai couru dans celui-ci. Je voulais un contrôle qui n'a été lu que mais non grisé.
hériter du contrôle de la grille de propriété et créez votre propre version en lecture seule en ajoutant le code suivant pour remplacer les appressions à la touche P>
#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
Vous avez oublié de mentionner que l'interface IMessageFilter doit être mise en œuvre. Quoi qu'il en soit, cette solution ne fonctionne pas car elle n'empêche pas l'utilisateur de cliquer ou de double-cliquer sur une liste déroulante et change (c'est-à-dire une valeur de cette façon.
J'ai trouvé une solution très rapide pour les thoses qui ne se soucient pas de la propriétéGratie étant grisée.
TypeDescriptor.AddAttributes(myObject, new Attribute[]{new ReadOnlyAttribute(true)}); propertyGrid1.SelectedObject = myObject;
C'est une excellente solution unique. Y a-t-il un moyen de l'annuler en code? J'ai essayé de chercher une propriété appelée "Readonly" sur l'objet après avoir appliqué votre code et il ne semblait pas l'avoir.
@ROGERBACON Vous pouvez l'annuler de la même manière Typedescriptor.addattributes (MyObject, Nouveau ReadonlyAttribute (Faux)); Code> Ce n'est pas aussi élégant, mais ça marche toujours.
J'ai fini par hériter de propriétéGrad et sélectionnez la catégorie mère chaque fois qu'une propriété est sélectionnée.
simple et pas besoin d'utiliser TypeDeScriptor. P>
public class ReadOnlyPropGrid : PropertyGrid { public ReadOnlyPropGrid() { this.ToolbarVisible = false; // categories need to be always visible } protected override void OnSelectedGridItemChanged(SelectedGridItemChangedEventArgs e) { if (e.NewSelection.GridItemType == GridItemType.Property) { if (e.NewSelection.Parent != null && e.NewSelection.Parent.GridItemType == GridItemType.Category) { this.SelectedGridItem = e.NewSelection.Parent; return; } } } }
Vous avez complètement raison. Votre seul moyen est d'ajouter l'attribut Readonly à chaque propriété publiée par votre personnalisé Typedescriptor. Il n'y a pas de solution flexible avec MSPG pour obtenir une propriété handicapéeGride qui est toujours défilable et "Propriété sélectionnable".