具有枚举值的C#Propertygrid组合框(Win Forms) [英] C# Propertygrid combobox with enum values (Win Forms)

查看:557
本文介绍了具有枚举值的C#Propertygrid组合框(Win Forms)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

public enum eVisualType
{
    None = 0, Torch = 1, Rune01, Rune02, Rune03, FireRed01,
    LaserBlackWhiteLeft, LaserBlackWhiteRight, LaserBlueRedLeft, LaserBlueRedRight,
    Wheel01, Wheel01a, Wheel02, BlinkingStar, MovingPillar
}

public class EnumTypeConverter : TypeConverter
{
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true; // True means show a combobox
    }
    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
    {
        return true; // True will limit to list. false will show the list, but allow free-formentry
    }
}

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 override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if(value is string)
            return (eVisualType)Enum.Parse(typeof(eVisualType), value.ToString(), true);
        return base.ConvertFrom(context, culture, value);
    }

}

propertygrid类中的代码: p>

Code in propertygrid class:

    private eVisualType m_VisualType = eVisualType.FireRed01;
    [CategoryAttribute("Basic"), DescriptionAttribute("The visual type.")]
    [TypeConverter(typeof(VisualTypeConverter))]
    [DisplayName("Visual Type")]
    public eVisualType VisualType
    {
        get { return m_VisualType; }
        set { m_VisualType = value; }
    }

在propertygrid中选择不同的值时,运行时:类型System.String的对象无法转换为类型'[项目名称] .eVisualType'。

The above still produces an error when selecting a different value in the propertygrid at runtime: Object of type 'System.String' cannot be converted to type '[project name].eVisualType'.

问题已经被提到一次或两次,但从未完全详细或仅适用于WPF +绑定。我使用Windows窗体。

The question has been asked before once or twice but never in full detail or it was for WPF+binding only. I use Windows Forms.

我还不确定是否需要ConvertFrom(..)。

I'm also not sure if the ConvertFrom(..) is needed at all.

推荐答案

TypeConverter是坏的(我需要从EnumConverter而不是TypeConverter。

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

这篇关于具有枚举值的C#Propertygrid组合框(Win Forms)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆