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 :

Etendu des possibilités de la propertyGrid


Sujet :

C#

  1. #1
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 104
    Par défaut Etendu des possibilités de la propertyGrid
    Bonjour,

    J'ai un collègue qui souhaite avoir dans son programme une property grid comme ci-dessous avec les unités physiques (cette photo est un montage).
    Est ce possible de faire ce qu'il souhaite ? Et si oui, comment ?

    Merci de votre aide.

    Pièce jointe 314411

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    nativement j'aurais tendance à dire non

    par contre tout est faisable
    soit tu bricoles autour du propertygrid pour qu'il fasse ça, soit tu créés un nouveau propertygrid qui fait ça
    dans les 2 cas ca demande un peu de code
    la 1ère question à se poser c'est comment le property grid trouve l'unité de chaque valeur ...

    et sinon windows forms ou wpf ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre expérimenté
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 176
    Par défaut
    Bonjour,

    Tu peux te baser sur cet article qui décrit l'utilisation de la PropertyGrid et en particulier l'utilisation des Converters qui devrait te convenir.
    Sinon pour une gestion plus fine des unités, tu as ça cet autre article.

    Bonne continuation.

  4. #4
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 104
    Par défaut
    Merci Kyroon, ca peut en effet m'aider.

    @Pol63 : Windows form.

    Merci je vais voir, je reviens quand j'aurai résolu le problème !

  5. #5
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 104
    Par défaut
    J'ai avancé dans mon "probleme".

    avec les liens de Kyroon, j'ai réussi à faire cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
            [DisplayName("Vitesse d'extrapolation"), Unite("Km/h"), TypeConverter(typeof(UniteIntegrator))]
            public double VitesseExtrapolation { get; set; }
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
        [AttributeUsage(AttributeTargets.Property)]
        public class Unite: Attribute
        {
            private string m_unite;
     
            public Unite(string theUnite)
            {
                m_unite = theUnite;
            }
     
            public string Value
            {
                get { return m_unite; }
            }
        }
     
     
     
        public class UniteIntegrator: TypeConverter
        {
            public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
            {
                Unite the = context.PropertyDescriptor.Attributes[typeof(Unite)] as Unite;
     
                return base.ConvertTo(context, culture, value.ToString() + " " + the.Value, typeof(string));
            }
     
            public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
            {
                return true;
            }
        }

    Au final, ca me donne cela :

    Pièce jointe 314807

    Ce qui est bien mais qui rends les propriétés non éditables....
    Une idée pour cela ?
    Merci.

  6. #6
    Membre chevronné
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Par défaut
    Je n'ai pas de réponse aux questions, mais deux idées sur le sujet:
    - pourquoi ne pas écrire l’unité dans la description (ex: Vitesse d'extrapolation (km/h)) ?
    - ou alors changer le type pour des strings, et écrire un parseur pour en extraire séparément valeur et unité ?

  7. #7
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 104
    Par défaut
    Citation Envoyé par nouanda Voir le message
    Je n'ai pas de réponse aux questions, mais deux idées sur le sujet:
    - pourquoi ne pas écrire l’unité dans la description (ex: Vitesse d'extrapolation (km/h)) ?
    - ou alors changer le type pour des strings, et écrire un parseur pour en extraire séparément valeur et unité ?
    Bonjour,

    en faite, pour deux raisons, la première parce que mon client veux comme cela dans la grille (bon, il serai pour mettre dans la description, mais personnellement, c'est pour apprendre de nouveaux trucs en c#. .

  8. #8
    Membre chevronné
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Par défaut
    Citation Envoyé par Flow_75 Voir le message
    Bonjour,

    en faite, pour deux raisons, la première parce que mon client veux comme cela dans la grille (bon, il serai pour mettre dans la description, mais personnellement, c'est pour apprendre de nouveaux trucs en c#. .
    Ce sont des raisons tout a fait recevables!
    Cela dit, la deuxieme option satisferait ton client ET te forcerait a écrire un parseur en béton armé!

  9. #9
    Membre expérimenté
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Septembre 2008
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 176
    Par défaut
    Bonjour,

    En fait, je pense qu'il te manque les méthodes CanConvertFrom et ConvertFrom dans ton converter, regarde dans le second lien, il y a un exemple où le gars décompose la string en une classe avec la valeur et l'unité.

    Bonne continuation.

  10. #10
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    ExpandableObjectConverter ne serait -il pas ton ami ,c'est le plus simple....!!!
    Evidemment il y a un découplage nécessaire à faire dévolu au custom Class CaracteristiqueUnite
    voici un code exemple:
    1/ code .cs du Class CaracteristiqueUnite
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    using System;
    using System.ComponentModel;
     
    namespace WinPropertyGrid
    {
     
     
        [TypeConverter(typeof(CaracteristiqueUniteConverter))]
        public class CaracteristiqueUnite 
        {
            private string _unite;
            private double _valeur;
            public CaracteristiqueUnite(string lunite, double lavaleur)
            {
                this._unite = lunite;
                this._valeur = lavaleur;
     
            }
            public string Unite
            {
                get { return _unite; }
                set { _unite = value; }
            }
            public double Valeur
            {
                get { return _valeur; }
                set { _valeur = value; }
            }
     
        }
     
     
    }
    code .cs de son Custom Converter:

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    using System;
    using System.ComponentModel;
     
    namespace WinPropertyGrid
    {
        public class CaracteristiqueUniteConverter : ExpandableObjectConverter
        {
            public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
            {
     
                if (sourceType == typeof(string)) return true;
                return base.CanConvertFrom(context, sourceType);
            }
     
            public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
            {
                 if(value.GetType() == typeof( string) )
                 {   try 
    	            {	        
                         // Exemple properties
                          string propertyList = value as string;
                          string[] properties = propertyList.Split("  ".ToCharArray());
                          return new CaracteristiqueUnite((string)properties[0],double.Parse( properties[1]));
    	            }
    	            catch (Exception)
    	            {
    		              throw new ArgumentException("The arguments were not valid.");
    	            }  
     
     
                }
     
     
     
                return base.ConvertFrom(context, culture, value);
            }
     
     
            public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
            {
                if (value.GetType() == typeof( CaracteristiqueUnite) )
                {
                    // Convert to String
                    if (destinationType == typeof(string))
                    {
     
                        CaracteristiqueUnite myhand = value as CaracteristiqueUnite;
                        return String.Format("{0}  {1}", myhand.Valeur.ToString(), myhand.Unite);
     
                    }
                }
                return base.ConvertTo(context, culture, value, destinationType);
            }
            //peut etre omis valeur par defaut
            public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
            {
                return base.CanConvertTo(context, destinationType);
            }
            // force a nouvelle instance
            public override bool  GetCreateInstanceSupported(ITypeDescriptorContext context)
            {
     	            return true;
            }
            // si GetCreateInstanceSupported renvoie true, alors CreateInstance sera utilisée pour creer une nouvelle a new instance 
            // chaque fois qu'une sous proprietes du expandable object a  change
            public override object  CreateInstance(ITypeDescriptorContext context, System.Collections.IDictionary propertyValues)
            { 
                 //' Use the dictionary to create a new instance
                return new CaracteristiqueUnite((string)propertyValues["Unite"], (double)propertyValues["Valeur"]);
     
            }
     
     }
    }
    le code .cs du Class utilisateur Exemple utilisant CaracteristiqueUnite :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    using System;
    using System.ComponentModel;
     
    namespace WinPropertyGrid
    {
     
       using System;
    using System.ComponentModel;
     
    namespace WinPropertyGrid
    {
     
        public  class Exemple
        {
            private string kmheure="Km/heure";
            private string newton = "N";
            public CaracteristiqueUnite Vitesse { get;set; }
     
            public CaracteristiqueUnite ForceStatique { get; set; }
     
            public CaracteristiqueUnite VitesseExtrapolation { get; set; }
            public Exemple()
            {
                this.Vitesse =new CaracteristiqueUnite(kmheure  , 25.0);
                this.ForceStatique = new CaracteristiqueUnite(newton  ,15.25);
                this.VitesseExtrapolation = new CaracteristiqueUnite(kmheure , 100.0);
            }
            public Exemple(CaracteristiqueUnite v, CaracteristiqueUnite fs, CaracteristiqueUnite ve):this()
            {
                this.Vitesse = v;
                this.ForceStatique = fs;
                this.VitesseExtrapolation = ve;
            }
        }
    }
     
    }
    le Form User avec utilisation du binding pour voir comment les modifications du PropertyGrid sont repercutées dans le Class Exemple :
    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
    25
    26
    27
    28
     
     
    namespace WinPropertyGrid
    {
        public partial class Form1 : Form
        {
            private Exemple exemple = new Exemple();
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                this.propertyGrid1.SelectedObject = exemple;
                this.label1.DataBindings.Add("Text", exemple, "Vitesse", true, DataSourceUpdateMode.OnPropertyChanged);
                this.label2.DataBindings.Add("Text", exemple, "ForceStatique", true, DataSourceUpdateMode.OnPropertyChanged);
                this.label3.DataBindings.Add("Text", exemple, "VitesseExtrapolation", true, DataSourceUpdateMode.OnPropertyChanged);
            }
     
              private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
            {
                exemple = propertyGrid1.SelectedObject as Exemple;
     
     
            }
        }
    }
    bon code....

  11. #11
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 104
    Par défaut
    Citation Envoyé par Kyroon Voir le message
    Bonjour,

    En fait, je pense qu'il te manque les méthodes CanConvertFrom et ConvertFrom dans ton converter, regarde dans le second lien, il y a un exemple où le gars décompose la string en une classe avec la valeur et l'unité.

    Bonne continuation.
    Merci !
    C'etait bien cela le probleme !

    @Mabrouki, j'avais vu le code d'exemple dans un lien fourni. Mais c'etait pas spécialement ce que j'avais en tete !

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

Discussions similaires

  1. [RegEx] exclure des possibilitées
    Par gok6tm dans le forum Langage
    Réponses: 3
    Dernier message: 03/02/2009, 12h57
  2. Etendue des données
    Par NeMo_O dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/08/2008, 00h35
  3. Réponses: 1
    Dernier message: 16/06/2008, 14h19
  4. [IE6] Limitation des possibilités
    Par RYAN78 dans le forum IE
    Réponses: 0
    Dernier message: 19/04/2008, 23h42
  5. [C# 2.0] Cacher des propriétés sur un PropertyGrid
    Par stailer dans le forum Windows Forms
    Réponses: 6
    Dernier message: 11/03/2008, 10h11

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