Définir de façon dynamique en lecture seule attribut de propriétés dans une grille de propriété
J'ai un PropertyGrid
que j'ai utilisé pour afficher les propriétés dans une classe d'assistance. - Je attribuer la classe d'aide à la PropertyGrid
comme ceci:
myPropertyGrid.SelectedObject = mySettingsHelper;
Dans la classe helper-je attribuer le ReadOnlyAttribute
au moment de la conception comme ceci:
[DisplayName("DisplayExA"),
Description("DescriptionExA"),
ReadOnlyAttribute(true)]
public string PropertyA { get; set; }
[DisplayName("DisplayExB"),
Description("DescriptionExB"),
ReadOnlyAttribute(false)]
public string PropertyB { get; set; }
[DisplayName("DisplayExC"),
Description("DescriptionExC"),
ReadOnlyAttribute(true)]
public string PropertyC { get; set; }
Mais maintenant, j'ai besoin d'être en mesure de modifier cet attribut sur les propriétés individuelles de façon dynamique lors de l'exécution. Basé sur certains critères, certaines de ces propriétés peuvent avoir besoin d'être en lecture seule ou non en lecture seule. Comment pourrais-je faire le changement de manière dynamique au moment de l'exécution?
EDIT:
J'ai essayé le code suivant mais il permet de définir l'attribut lecture seule pour chaque instance de l'objet! Je veux le faire par objet. Parfois, un objet pourrait avoir PropertyA en lecture seule, tandis qu'un second objet a PropertyA de ne pas être en lecture seule.
public static class PropertyReadOnlyHelper
{
public static void SetReadOnly(object container, string name, bool value)
{
try
{
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(container.GetType())[name];
ReadOnlyAttribute attribute = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)];
FieldInfo fieldToChange = attribute.GetType().GetField("isReadOnly",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance);
fieldToChange.SetValue(attribute, value);
}
catch { }
}
}
PropertyGrid
utilisez-vous dans votre application? Je pense que votre but peut être atteint que si il ya seulement 1 PropertyGrid
utilisé à un moment, nous avons encore de changer le Attribute
pour le type, mais avant de sélectionner un objet, nous allons basculer le ReadOnly
en conséquence, et cela devrait faire l'affaire.
OriginalL'auteur Michael Mankus | 2013-10-28
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure de faire exactement ce dont j'ai besoin (niveau de l'objet de l'affectation de l'attribut en lecture seule) à l'aide de la bibliothèque à partir de cette CodeProject article. Ce qui est bien c'est qu'il me permet d'utiliser encore le .NET
PropertyGrid
et il suffit d'utiliser les attributs personnalisés pour gérer la dynamique des paramètres.OriginalL'auteur Michael Mankus
Utiliser la réflexion pour obtenir l'instance de référence de la
ReadOnlyAttribute
classe, puis bascule l'IsReadOnly
de propriété sur cette instance. Enfin, re-sélectionnez l'élément dans la grille des propriétés si nécessaire par les paramètres de son SelectedObjects à null et puis réinitialiser. Vous pourriez être en mesure de le faire à l'aide de la grille de propriétéRefreshTabs
méthode de trop, je ne suis pas sûr.EDIT:
Malheureusement, le IsReadOnly propriété est en lecture seule... dans ce cas, nous devrions avoir à utiliser la réflexion pour modifier la valeur du champ de stockage de la propriété IsReadOnly.
OriginalL'auteur Trevor Elliott
Ajouter Readonly
Supprimer readonly
OriginalL'auteur Hafsal