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 :

Utilisation d'une enum comme propriété d'un custom control (propertygrid)


Sujet :

C#

  1. #1
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut Utilisation d'une enum comme propriété d'un custom control (propertygrid)
    Bonjour,

    J'ai pour l'une de mes custom activity pour workflow foundation, besoin d'avoir une propriété de type Integer mais relié à une enum.

    En gros, j'aimerai que avoir une propriété de type Integer mais que la propertygrid du designer de Visual Studio me permette de choisir parmi une liste déroulante listant les valeurs de mon enum. (sisi c'est possible, j'en suis convaincu).

    Voici ma classe simplifiée
    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
    public partial class StatusActivity: SequenceActivity
    	{
    		public StatusActivity()
    		{
    			InitializeComponent();
    		}
     
            private int _statusID;
            [Browsable(true)]
            [Category("TAD")]
            [Description("ID of the status of the demand")]
            [ValidationOption(ValidationOption.Required)]
            [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
            [TypeConverter(typeof(StatusIDConverter))]
    	    public int StatusID
    	    {
                get { return _statusID; }
                set { _statusID = value; }
    	    }
    	}
    et voici le converter qui sert au niveau de la propertygrid (c'est un peu tout et n'importe quoi mais c'est parce que j'ai tout essayé et rien ne marche :/
    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
    public class StatusIDConverter : EnumConverter
        {
            private readonly Type _enumType;
     
            public StatusIDConverter(Type type) : base(type)
            {
                _enumType = type;
            }
     
            public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
            {
                return new StandardValuesCollection(Enum.GetValues(_enumType));
            }
     
            public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
            {
                if (destinationType == _enumType)
                    return true;
                return base.CanConvertFrom(context, destinationType);
            }
     
            public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
            {
                if (sourceType == _enumType)
                    return true;
                return base.CanConvertFrom(context, sourceType);
     
            }
     
            public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
            {
                return (Int32) Enum.Parse(_enumType, value.ToString()); //base.ConvertTo(context, culture, value, destinationType);
                //return base.ConvertFrom(context, culture, value);
            }
            public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
            {
                //return base.ConvertFrom(context, culture, value);
                return (Int32)Enum.Parse(_enumType, value.ToString()); //base.ConvertTo(context, culture, value, destinationType);
            }
            public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
            {
                return true;
            }
     
            public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
            {
                return true;
            }
     
        }
    Pour l'instant, j'arrive parfaitement à obtenir le fait que VStudio me propose une liste déroulante avec les noms de mon enum mais lorsque je sélectionne un element j'ai une exception "cannot convert string to int". En gros, faut qu'à un endroit, à partir de la string, je parse l'enum pour trouver la valeur sauf que je sais pas où le mettre :/


    une idée?


    et l'enum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public enum HistoryStatus
        {
            NewDemand = 1,
            WaitingForCFValidation = 2,
            WaitingForCoordinatorValidation = 3,
            WaitingForCBCValidation = 4,
            WaitingForHabilitationConfirmation = 5,
            HabilitationConfirmed = 6,
            HabilitationRefused = 7
        }
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  2. #2
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    la solution était plus simple que prévue...

    suffit de mettre une propriété de type Enum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public HistoryStatus StatusID
    	    {
                get { return _statusID; }
                set { _statusID = value; }
    	    }
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  3. #3
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Sinon, garder la propriété en int, et un simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class StatusIDConverter : EnumConverter
    {
      public StatusIDConverter() : base(typeof(HistoryStatus))
      {
      }
    }
    fait le boulot très correctement...

  4. #4
    Rédacteur
    Avatar de Louis-Guillaume Morand
    Homme Profil pro
    Cloud Architect
    Inscrit en
    Mars 2003
    Messages
    10 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Cloud Architect
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 10 839
    Points : 28 252
    Points
    28 252
    Par défaut
    Object of type 'System.String' cannot be converted to type 'System.Int32'.
    avec ta solution :/
    moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom

  5. #5
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Étonnant, j'ai testé pourtant. Tu dois avoir quelque chose de bizarre ailleurs que tu n'as pas mentionné.

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

Discussions similaires

  1. utilisation d'une variable comme nom de colonne
    Par argonath dans le forum Développement
    Réponses: 11
    Dernier message: 13/08/2010, 14h43
  2. [Lazarus] Utilisation d'une fiche comme modèle
    Par ovni76 dans le forum Lazarus
    Réponses: 5
    Dernier message: 16/02/2010, 21h26
  3. [AC-2003] Utilisation d'une valeur comme nom de champ.
    Par marco361020 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 09/08/2009, 01h17
  4. [WD10] Utiliser une indirection comme propriété
    Par iiban dans le forum WinDev
    Réponses: 12
    Dernier message: 03/03/2009, 11h31
  5. Réponses: 0
    Dernier message: 26/07/2007, 15h22

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