C# Propertygrid combobox with enum values (Win Forms)

99封情书 提交于 2019-12-03 20:32:10

The TypeConverter was bad (I needed to derrive from EnumConverter and not from TypeConverter.

using System;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;

namespace [namespace]
{
    public class EnumTypeConverter : EnumConverter
    {
        private Type m_EnumType;
        public EnumTypeConverter(Type type)
            : base(type)
        {
            m_EnumType = type;
        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destType)
        {
            return destType == typeof(string);
        }

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destType)
        {
            FieldInfo fi = m_EnumType.GetField(Enum.GetName(m_EnumType, value));
            DescriptionAttribute dna =
                (DescriptionAttribute)Attribute.GetCustomAttribute(
                fi, typeof(DescriptionAttribute));

            if (dna != null)
                return dna.Description;
            else
                return value.ToString();
        }

        public override bool CanConvertFrom(ITypeDescriptorContext context, Type srcType)
        {
            return srcType == typeof(string);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            foreach (FieldInfo fi in m_EnumType.GetFields())
            {
                DescriptionAttribute dna =
                (DescriptionAttribute)Attribute.GetCustomAttribute(
                fi, typeof(DescriptionAttribute));

                if ((dna != null) && ((string)value == dna.Description))
                    return Enum.Parse(m_EnumType, fi.Name);
            }
            return Enum.Parse(m_EnumType, (string)value);
        }
    }
}

http://www.codeproject.com/Articles/22717/Using-PropertyGrid

Try by Reflection:

public static T GetEnumMemberFromName<T>(string name)
    {
        return (T)Enum.Parse(typeof(T), name);
    }

In your code:

public class VisualTypeConverter : EnumTypeConverter  
{  
    public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)  
    {  
        return new StandardValuesCollection(new eVisualType[] { eVisualType.BlinkingStar, eVisualType.FireRed01, eVisualType.LaserBlackWhiteLeft, eVisualType.LaserBlackWhiteRight, eVisualType.LaserBlueRedLeft, eVisualType.LaserBlueRedRight, eVisualType.MovingPillar, eVisualType.Rune01, eVisualType.Rune02, eVisualType.Rune03, eVisualType.Torch, eVisualType.Wheel01, eVisualType.Wheel01a, eVisualType.Wheel02 });  
    }  

     public T GetEnumMemberFromName<T>(string name)
    {
        return (T)Enum.Parse(typeof(T), name);
    }

}  

Example:

eVisualType  myEnumMember = myVisualTypeConverterInstance.GetEnumMemberFromName<eVisualType>("Torch");
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!