2011-05-27 3 views
2

Est-il possible d'appliquer EditableAttribute à l'exécution? Je veux rendre certaines propriétés modifiables uniquement lorsque l'utilisateur a un rôle. Malheureusement EdiatbleAttribute est scellé. Je peux essayer de l'appliquer à l'exécution par réflexion mais peut-être y a-t-il une façon plus appropriée de le faire. Merci pour tout conseil.comment rendre les champs modifiables à l'exécution

Meilleures salutations

+1

Remarque: vous ne pouvez pas modifier les attributs par réflexion. Vous pouvez * le faire en utilisant 'System.ComponentModel', mais cela ne fonctionne que si l'appelant * demande * via' System.ComponentModel'. Malheureusement * au niveau de la propriété * (plutôt que le niveau du type), il est difficile de le faire, et je pense qu'il est peu probable qu'il atteigne quoi que ce soit dans ce scénario (je suppose que l'appelant interroge par réflexion) –

Répondre

1

Il y a un bidouille disponible à: How to Set Attribute Value at Runtime-- and How to Work around a Silly Bug

private void SetPropertyGrid() 
{ 
    PropertyDescriptor descriptor = TypeDescriptor.GetProperties(typeof(Student))["Address"]; 
    ReadOnlyAttribute attrib = (ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)]; 
    FieldInfo isReadOnly = attrib.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); 
     isReadOnly.SetValue(attrib,true); 

    propertyGrid1.SelectedObject = new Student(); 
} 

J'ai pu à ce code pour modifier la valeur d'attribut ReadOnly de la propriété. L'instruction propertyGrid1.SelectedObject = new Student(); peut être remplacée par propertyGrid1.SelectedObject = myStudent, c'est-à-dire que vous pouvez modifier les propriétés d'un objet existant.

En outre, un coup d'oeil à une question similaire: Change Attribute's parameter at runtime

0

je pense une bonne option est de créer une aide d'extension pour le contrôle, vous devez utiliser (TextBox etc) et si la propriété IsReadOnly est vrai (éditable (false)) puis générer une zone de texte désactivé .

+0

peut le faire de cette façon, mais je préfère une solution plus générale. – krlm

Questions connexes