在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)

此文为我在博客园中的第一篇文章,这是个不错的地方,记录项目开发中的点点滴滴。To share is a point J 。文章有何不清指出,请大家指教。

言归正传,相信大家不会陌生如何将自定义的enum绑定到drop down list控件,即利用.net自带的枚举工具类EnumGetNames方法和GetValues方法。

但有这样一种情况,假设我们定义的枚举OpportunityInfoTypes中存在一个枚举项的名称为NewOpportunity,值为2。但是我们想绑定到ComboBox控件时,界面上显示              New Opportunity (注意NewOpportunity中间有个空格),并且当这个ComboBox item被选中时,选中的value2

通过下面步骤可以实现:

1,定义枚举,这里注意,在每个枚举项前添加Description属性类修饰,此类有个构造是允许传入一个字符串值,当然字符串中可以包括任意字符了,包括空格。注意:Description类属于System.ComponentModel namespace下!

1 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)      public   enum  OpportunityInfoTypes
2 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)     {
3在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        [Description("None")]
4在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        None = 0,
5在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        [Description("Existing")]
6在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        Existing = 1,
7在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        [Description("New Opportunity")]
8在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        NewOpportunity = 2,
9在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)}

 

2,下面我们需要定义一个“工具”类用于根据枚举项的名字获得Description属性类的值,如下:

 1 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)      /// <summary>
 2在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)    /// EnumConverter supporting System.ComponentModel.DescriptionAttribute
 3在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)    /// </summary>

 4 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)      public   class  EnumDescConverter : System.ComponentModel.EnumConverter
 5 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)     {
 6在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        protected System.Type m_MyVal;
 7在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)
 8在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// <summary>
 9在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// Gets Enum Value's Description Attribute
10在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// </summary>
11在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// <param name="value">The value you want the description attribute for</param>
12在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// <returns>The description, if any, else it's .ToString()</returns>

13在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        public static string GetEnumDescription(Enum value)
14在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        {
15在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            FieldInfo fi = value.GetType().GetField(value.ToString());
16在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            DescriptionAttribute[] attributes =
17在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)              (DescriptionAttribute[])fi.GetCustomAttributes(
18在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)              typeof(DescriptionAttribute), false);
19在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            return (attributes.Length > 0? attributes[0].Description : value.ToString();
20在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        }

21在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)
22在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// <summary>
23在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// Gets the description for certaing named value in an Enumeration
24在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// </summary>
25在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// <param name="value">The type of the Enumeration</param>
26在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// <param name="name">The name of the Enumeration value</param>
27在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// <returns>The description, if any, else the passed name</returns>

28在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        public static string GetEnumDescription(System.Type value, string name)
29在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        {
30在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            FieldInfo fi = value.GetField(name);
31在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            DescriptionAttribute[] attributes =
32在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)              (DescriptionAttribute[])fi.GetCustomAttributes(
33在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)              typeof(DescriptionAttribute), false);
34在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            return (attributes.Length > 0? attributes[0].Description : name;
35在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        }

36在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)
37在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// <summary>
38在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// Gets the value of an Enum, based on it's Description Attribute or named value
39在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// </summary>
40在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// <param name="value">The Enum type</param>
41在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// <param name="description">The description or name of the element</param>
42在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        /// <returns>The value, or the passed in description, if it was not found</returns>

43在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        public static object GetEnumValue(System.Type value, string description)
44在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        {
45在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            FieldInfo[] fis = value.GetFields();
46在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            foreach (FieldInfo fi in fis)
47在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            {
48在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                DescriptionAttribute[] attributes =
49在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                  (DescriptionAttribute[])fi.GetCustomAttributes(
50在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                  typeof(DescriptionAttribute), false);
51在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                if (attributes.Length > 0)
52在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                {
53在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                    if (attributes[0].Description == description)
54在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                    {
55在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                        return fi.GetValue(fi.Name);
56在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                    }

57在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                }

58在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                if (fi.Name == description)
59在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                {
60在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                    return fi.GetValue(fi.Name);
61在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                }

62在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            }

63在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            return description;
64在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        }

65在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)
66在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        public EnumDescConverter(System.Type type)
67在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            : base(type.GetType())
68在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        {
69在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            m_MyVal = type;
70在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        }

71在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)
72在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
73在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        {
74在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            if (value is Enum && destinationType == typeof(string))
75在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            {
76在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                return GetEnumDescription((Enum)value);
77在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            }

78在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            if (value is string && destinationType == typeof(string))
79在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            {
80在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                return GetEnumDescription(m_MyVal, (string)value);
81在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            }

82在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            return base.ConvertTo(context, culture, value, destinationType);
83在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        }

84在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)
85在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
86在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        {
87在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            if (value is string)
88在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            {
89在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                return GetEnumValue(m_MyVal, (string)value);
90在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            }

91在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            if (value is Enum)
92在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            {
93在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                return GetEnumDescription((Enum)value);
94在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            }

95在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            return base.ConvertFrom(context, culture, value);
96在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)        }

97在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)}

98 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)

  

3,利用我们先前定义的“工具”类,实现ComboBox控件绑定:

 1 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)              // 清空combobox所有项
 2 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)             YourComboBoxControl.Items.Clear();
 3 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)
 4 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            EnumDescConverter enumdescconverter  =   new  EnumDescConverter( typeof (OpportunityInfoTypes));
 5 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)             string [] names  =  Enum.GetNames( typeof (OpportunityInfoTypes));
 6 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)             int [] values  =  ( int [])Enum.GetValues( typeof (OpportunityInfoTypes));
 7 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)
 8 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)             for  ( int  i  =   0 ; i  <  names.Length; i ++ )
 9 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)             {
10在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)                YourComboBoxControl.Items.Add(new ComboBoxItem((string)enumdescconverter.ConvertTo(names[i], typeof(string)), values[i].ToString()));
11在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)            }

12 在.Net中将Enum绑定到ComboBox控件 (思想适用于Asp.net和WinForm)

请注意这句代码(string)enumdescconverter.ConvertTo(names[i], typeof(string)) ,用于根据枚举项名字获得相应的Description




嗯,就写到这里吧
Jgood luck everybody.

你可能感兴趣的:(combobox)