IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Comment changer dynamiquement la valeur d'un attribut d'une instance ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Par défaut Comment changer dynamiquement la valeur d'un attribut d'une instance ?
    Bonjour,

    En ce moment, je travail sur l’utilisation (affichage et édition) des attributs des propriétés d'un objet. L'objet est lui bindé directement sur une propertyGrid.

    Pour info, le propertyGrid présente 1 objet « personne » qui est composé de 2 objets « adresse ». Les « adresses » sont aussi accessible dans la propertygrid par l’utilisation de l’instruction suivante : [TypeConverter(typeof(ExpandableObjectConverter))]

    La classe static ci-dessous me sert de boite à outil pour modifier dynamiquement les valeurs des attributs.

    Mon probleme est le suivant, lorsque je change dynamiquement la valeur (ex : code postal) d’un attribut de l’adresse1, l’attribut de l’adresse2 est modifié lui aussi.

    En faite, le TypeDescriptor travail sur les type d’objet alors qu’il faudrait que je puisse travailler sur l’instance de l’objet.

    Merci par avance de votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public static class PropertyDescriptorDynamic
        {
            public static void uSetReadOnly(object instance, string property, bool isReadOnly)
            {
                if (instance != null)
                {
                    PropertyDescriptor descriptor = TypeDescriptor.GetProperties(instance.GetType())[property];
                    ReadOnlyAttribute attribute = descriptor.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
                    FieldInfo field = attribute.GetType().GetField("isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
                    field.SetValue(attribute, isReadOnly, BindingFlags.NonPublic | BindingFlags.Instance, null, null);
                }
            }
     
    }
     
     
    …
     
    // changement dynamique des valeur de l’attribut pour ADRESSE1
     
    PropertyDescriptorDynamic.uSetReadOnly(ADRESSE1, "CODEPOSTAL", false);
    PropertyDescriptorDynamic.uSetReadOnly(ADRESSE1, "VILLE", false);
     
    …
    Cordialement,

    Cédric

  2. #2
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut Comment modifier dynamiquement le ReadOnly attribut d'un objet
    Tu fais de la reflexion, GetProperties va te cherchercher tes propriétés.
    Ton zip code addr 1 et zip code addr 2 ont le même nom de property (à priori).

    static ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static void uSetReadOnly(object instance, string property, bool isReadOnly)
    tu passes quoi comme "instance" ?

  3. #3
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Par défaut
    Bonjour kheironn,

    En effet, le zip code addr 1 et zip code addr 2 ont le même nom de property, puisque se sont des instances issue de la même classe.

    Dans le paramètre instance de la methode uSetReadOnly, je passe l'instance de l'addr1. Mais l'appel de cette méthode modifie aussi l'addr2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static void uSetReadOnly(object instance, string property, bool isReadOnly)

    Merci.

    Cédric

  4. #4
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Je serais assez curieux de savoir si c'est possible, mais je ne pense pas.
    .NET ne fait pas un duplicata du code de la classe pour chaque instance (heureusement pour la mémoire!), une instance est plutot "l'ensemble des valeurs des champs d'une classe xxx" et quand une fonction de la classe xxx est appellée il passe cet ensemble (appellé this en C#) comme parametre (si vous regardez le MSIL vous verrez). Et donc si on change quelque chose au code de la classe, ce sera repercuté pour toutes les instances.

    Je ne sais pas si c'est clair, mais je me comprends

  5. #5
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Par défaut
    Bonjour EquinoxeDotNet,

    Merci pour ta réponse.

    En faite, le but exact est d'interdire dynamiquement l'accès (en modification) d'une propriété affiché dans un propertyGrid.

    Malheureusement, je ne parviens pas à réaliser cette interdiction que par l'utilisation de l'attribut ReadOnly.

    (Ex de règle de gestion : si le type sexe=F alors interdire la saisie de l'âge.)

    Si une personne connaît l'astuce je suis preneur.

    Merci

    Cédric

  6. #6
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705

Discussions similaires

  1. Comment changer dynamiquement un sous-formulaire
    Par ver_for dans le forum IHM
    Réponses: 6
    Dernier message: 04/10/2008, 22h19
  2. Réponses: 15
    Dernier message: 26/06/2006, 16h45
  3. Comment changer la valeur d'un attribut avec une stylesheet?
    Par BugsBunny dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 02/06/2006, 18h18
  4. [WebForms]Comment changer dynamiquement la position d'un TextBox ?
    Par Dan_Rich dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 19/05/2006, 00h57
  5. Comment changer dynamiquement la valeur d'une option de DbGrid ?
    Par Atrebate62 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/03/2005, 13h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo