Winform DatagridviewComboBox 绑定枚举实现显示Description


场景:

DatagridView中有一个ComboBox列,希望该列绑定到某个对象的一个枚举类型的成员,同时,Combox下拉列表显示的是枚举的Description。

如定义类RowItem和枚举 TypeEnum,我们希望在UI上显示的是”A相“和”B相“而不是”A“和”B“。

 public  class  RowItem
    {
        TypeEnum t = TypeEnum.A;

        public TypeEnum T 
        {
            get => t; 
            set => t = value;
        }
    }

    public  enum TypeEnum 
    {
        [Description("A相")]
         A,
        [Description("B相")]
         B
    }

实现方法:

为了达到该目的,我们可以通过设置EnumConverter来实现:

  [TypeConverter(typeof(TypeEnumConverter))]
    public  enum TypeEnum 
    {
        [Description("A相")]
         A,
        [Description("B相")]
         B
    }

    public class TypeEnumConverter : EnumConverter
    {
        public TypeEnumConverter() : base(typeof(TypeEnum))
        {
        }

        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value is string)
            {
                return (value as string).GetEnumFormDescription<TypeEnum>();
            }
            return base.ConvertFrom(context, culture, value);
        }

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if(value is TypeEnum) 
            {
                return ((TypeEnum)value).GetEnumDescription();
            }

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

      
    }
    /// <summary>
    /// 辅助拓展方法用于Descripition和枚举值之间的转换
    /// </summary>
    public static class EnumExtension 
    {
        public static T GetEnumFormDescription<T>(this string description) where T : Enum
        {
            var values = typeof(T).GetEnumValues();
            var targets = values.OfType<T>().Where(v => v.GetEnumDescription() == description); 
            foreach ( T item in targets) 
            {
                return item;
            }
            throw new ArgumentException("Not found.", nameof(description));
        }

        public static string GetEnumDescription(this Enum value)
        {
            FieldInfo fi = value.GetType().GetField(value.ToString());

            DescriptionAttribute[] attributes = fi.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];

            if (attributes != null && attributes.Any())
            {
                return attributes.First().Description;
            }

            return value.ToString();
        }
    }

UI的代码如下

 public partial class Form1 : Form
    {
         
        public Form1()
        {
            InitializeComponent();
            InitDgv();
        }

        BindingList<RowItem> blist = new BindingList<RowItem>();
        private void InitDgv()
        {
            var column=new DataGridViewComboBoxColumn();
            column.HeaderText = "类型";
            column.DataPropertyName = nameof(RowItem.T);
            column.DataSource = Enum.GetValues(typeof(TypeEnum));//设置Combbox下拉列表,
                                                                 //此处不应该调用column.Items.Add()
            dataGridView1.Columns.Add(column);
            blist.Add(new RowItem());
            dataGridView1.DataSource = blist;

        }
    }

运行截图如下

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM