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 :

Appel propriété par son nom [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut Appel propriété par son nom
    Bonsoir à tous, je rencontre un problème que je ne vois pas comment résoudre.

    donc j'utilise un class avec la propriété suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [XmlElement("Lien"), DisplayName("Lien")]
    public string Href
    {
    get { return _href; }
    set { _href = value; }
    }
    //autre propriété de la class
    dans un datagrid view j'affiche une liste de cette classe de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    dtGridMarks.AutoGenerateColumns = false;
    ...			
    int index;		
    index = dtGridMarks.Columns.Add("Href", "Href");
    dtGridMarks.Columns[index].DataPropertyName = "Titre";
    dtGridMarks.DefaultCellStyle.ForeColor = Color.Black;
    ...//autre propriété de la class
    dtGridMarks.DataSource = lst;
    ...
    afin de trier la liste sur base de l'entête cliqué du datagrid view, je fait appel à la méthode de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.DataSource = _ctrlrOrder.OrderMarks((List<Mark>)this.DataSource, this.Columns[e.ColumnIndex].HeaderText);
    Ma méthode de tri étant la suivante:

    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 List<Mark> OrderMarks(List<Mark> lst, string orderOn){
     
    switch(orderOn){
    case "Titre" :
    lst = (_orderDescending == true) ? 
    lst.OrderByDescending(x => x.Titre).ToList() :
    lst.OrderBy(x => x.Titre).ToList();
    break;
     
    case "Href" :
    lst = (_orderDescending == true) ? 
    lst.OrderByDescending(x => x.Href).ToList() :
    lst.OrderBy(x => x.Href).ToList();
    break;
     
    default:
    break;
    }
     
    _orderDescending = (_orderDescending == true) ? false : true;
     
    return lst;
    }
    la question est donc comment puis-je faire pour généraliser mon switch en remplacant le x=>x.Href de manière générique et ainsi ne pas faire un cas pour chaques propriétes de la classe.

    Je pensais éventuellement quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public List<Mark> OrderMarks(List<Mark> lst, string orderOn){
    var prop = typeof(Mark).GetProperty(orderOn);
    lst =  lst.OrderByDescending(x => x.prop).ToList();
    return lst;
    }
    evdement ca ne marche pas. :-(

  2. #2
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Tu es sur la bonne piste. Le soucis est que tu ne vas pas jusqu'au bout du raisonnement.

    GetProperty te retourne des infos sur une propriété, et non la valeur de la propriété elle-même. Pour cela, il faut utiliser la méthode PropertyInfo.GetValue.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public List<Mark> OrderMarks(List<Mark> lst, string orderOn){
    var prop = typeof(Mark).GetProperty(orderOn);
    lst =  lst.OrderByDescending(x => prop.GetValue(x)).ToList();
    return lst;
    }

  3. #3
    Membre confirmé
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    Impecable ca marche comme je veux. Merci

    Est-il possible de faire de même avec le displayname de la propriété?

  4. #4
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Avec la propriété Name peut-être ?

    Sinon, il faut que tu me dises ce que tu entends par "displayName"

  5. #5
    Membre confirmé
    Profil pro
    Débutant
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Débutant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    Ce que j'entend par le displayname c'est l'attribut de la propriété qui est utilisé lors de création automatique des entêtes des datagridview

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [XmlElement("Lien"), DisplayName("Lien")]
    public string Href
    {
    get { return _href; }
    set { _href = value; }
    }

  6. #6
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Ok. Donc oui tu peux. A partir de ton instance de PropertyInfo, tu peux récupérer les attributs qui sont dessus. Il faut que tu t'intéresses à l'attribut qui a le type "DisplayNameAttribute"

  7. #7
    Membre émérite
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Par défaut
    Bonjour,

    Voici un petit exemple :
    Classe Test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public class Test
        {
            [DisplayName("Test id")]
            public int Id { get; set; }
     
            [DisplayName("Test name")]
            public string Name { get; set; }
        }
    Lister les propriétés et leur "displayName" :
    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
            static void Main(string[] args)
            {
                var properties = typeof(Test).GetProperties()
                    .Select(p => new
                    {
                        PropertyName = p.Name,
                        DisplayName = p.GetCustomAttributes(typeof(DisplayNameAttribute), false)
                        .Cast<DisplayNameAttribute>().Single().DisplayName
                    });
     
                foreach (var property in properties)
                {
                    Console.WriteLine("PropertyName : {0} - DisplayName : {1}",
                        property.PropertyName, property.DisplayName);
                }
     
                Console.ReadLine();
            }
    Par contre j'ai l'impression que tu es entrain de fabriquer une usine à gaz... (Utiliser la réflexion juste pour ordonner un liste avec un méthode non générique)...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/11/2009, 15h15
  2. Réponses: 1
    Dernier message: 22/01/2009, 15h26
  3. [POI] Appeler une cellule par son nom
    Par Galak extra dans le forum Documents
    Réponses: 9
    Dernier message: 17/06/2008, 14h33
  4. [VB6] Appeler une procedure par son nom.
    Par kenn dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 24/05/2006, 09h29
  5. Accéder à une propriété par son nom
    Par Neilos dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/09/2005, 21h34

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