ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Winform DatagridviewComboBox 绑定枚举实现显示Description

2022-03-19 11:03:36  阅读:140  来源: 互联网

标签:return Description column value TypeEnum DatagridviewComboBox public Winform


场景:

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;

        }
    }

运行截图如下

 

标签:return,Description,column,value,TypeEnum,DatagridviewComboBox,public,Winform
来源: https://www.cnblogs.com/fastexpress/p/16025656.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有