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

Archive
<July 2010>
SunMonTueWedThuFriSat
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
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 2010
Felice Pollano
Sign In
Statistics
Total Posts: 60
This Year: 34
This Month: 5
This Week: 2
Comments: 26
This blog visits
Locations of visitors to this page
All Content © 2010, Felice Pollano
DasBlog theme 'Business' created by Christoph De Baene (delarou) and modified by Felice Pollano