7
votes

Loveonly PropertyGrid

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.

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?


1 commentaires

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".


5 Réponses :


0
votes

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


0 commentaires

3
votes

Étant donné que vous implémentez iCustomTypeScriptor Il n'est pas nécessaire d'ajouter des attributs; Vous pouvez simplement remplacer iSreadonly sur le matérialité ImpéritéDescriptor . Je pense que cela devrait être assez simple d'écrire un type intermédiaire qui imitat (via iCustomtypedescriptor et typecotverter ) un type emballé mais retourne toujours réadonnement PropertyDesipTor Instances? Faites-moi savoir si vous voulez un exemple (ce n'est pas trivial si).

Vous voudrez peut-être aussi vérifier si quelque chose comme celui-ci offre qu'il l'a construit.


1 commentaires

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?



0
votes

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


1 commentaires

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.



16
votes

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;


2 commentaires

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)); Ce n'est pas aussi élégant, mais ça marche toujours.



0
votes

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


0 commentaires