The official Fatica Labs Blog! RSS 2.0
# Tuesday, July 31, 2007

E' un po' che uso questa strategia, soprattutto perchè mi piace il componente propertygrid, che permette di editare le proprietà pubbliche di un oggetto.  Se una delle proprietà è un enum, viene graziosamente presentato un combobox per scegliere il valore possibile. Tuttavia le scritte presentate sono i nomi interni dell'enum, che possono essere un po' criptici per l'utente finale, e peggio a volte devono essere tradotti. Visto che non si può derivare una classe da un enum per fare l'override di ToString(), una ( possibile ) soluzione è quella di utilizzare un TypeConverter

xes: 

    [TypeConverter(typeof(SheetForecastingEnumConverter))]
    public enum SheetForecastingEnum
    {
        None,
        Auto,
        UserSelection
    }

 

quindi si implementa la classe del converter: 

 

class SheetForecastingEnumConverter : TypeConverter
    {
        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            if (value is string)
            {
                switch (value)
                {
                    case "None":
                        return SheetForecastingEnum.None;
                   ........ // altri case per i vari valori
                }
            }
            return base.ConvertFrom(context, culture, value);
        }
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
                return true;
            return base.CanConvertFrom(context, sourceType);
        }
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            //show combobox
            return true;
        }
        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            //show non editable combobox
            return true;
        }
        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            return new StandardValuesCollection
                (
                    new SheetForecastingEnum[] { SheetForecastingEnum.Auto, SheetForecastingEnum.None, SheetForecastingEnum.UserSelection }
                );
        }
        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(string) && value != null)
            {

                SheetForecastingEnum ct = (SheetForecastingEnum)value;
                switch (ct)
                {
                    case SheetForecastingEnum.None:
                        return "Nessuno";

                    ......
                  
                    default:
                        return "?";

                }
            }
            else
                return base.ConvertTo(context, culture, value, destinationType);
        }
    }

ed il gioco è fatto. 

Tuesday, July 31, 2007 4:58:00 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback


My Stack Overflow
Contacts

Send mail to the author(s) E-mail

Tags
profile for Felice Pollano at Stack Overflow, Q&A for professional and enthusiast programmers
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2012
Felice Pollano
Sign In
Statistics
Total Posts: 143
This Year: 3
This Month: 0
This Week: 0
Comments: 105
This blog visits
All Content © 2012, Felice Pollano
DasBlog theme 'Business' created by Christoph De Baene (delarou) and modified by Felice Pollano