Combobox绑定枚举类型的中文注释,并且选中后会得到枚举的排序值

博客展示了如何将带有中文注释的枚举绑定到ComboBox控件,以便在.NET应用中实现用户友好的界面。通过GetEnumDesc方法获取枚举的描述,并利用ToList方法将枚举转换为列表,最后绑定到ComboBox,使选中项返回枚举的排序值。文章还解释了Enum和enum的区别以及如何处理枚举遍历的问题。

在写代码的过程中经常会遇到需要把枚举类型绑定到下拉框combobox中,为了界面的友好性,最好显示枚举的中文注释,并且在选中某一项时,得到的selectvalue为枚举的排序值。

今天找了好多文章都没找到合适的解决代码,最后看了这样一个帖子稍作修改后完美解决了,我将代码贴在这里吧:

枚举:

 public enum DataType
        {
            [Description("未知")]
            unknown = 0,
            [Description("字符型")]
            econstring = 1,
            [Description("数值型")]
            econfloat = 2,
            [Description("开关量")]
            econboolean = 3     
        }

方法:

        /// <summary>
        /// 得到枚举的中文注释
        /// </summary>
        /// <param name="e"></param>
        /// <returns></returns>
        private static string GetEnumDesc(Enum e)
        {
            FieldInfo EnumInfo = e.GetType().GetField(e.ToString());
            DescriptionAttribute[] EnumAttributes = (DescriptionAttribute[])EnumInfo.
                GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (EnumAttributes.Length > 0)
            {
                return EnumAttributes[0].Description;
            }
            return e.ToString();
        }


      private static IList ToList(Type type)
        {
            if (type == null) throw new ArgumentNullException("type");
            if (!type.IsEnum) throw new ArgumentException("Type provided must be an Enum.", "type");

            ArrayList list = new ArrayList();
            Array array = Enum.GetValues(type);
            foreach (Enum value in array)
            {
                list.Add(new KeyValuePair<Enum, string>(value, GetEnumDesc(value)));
            }
            return list;
        }

最后测试:

    public static void BindComboxToDataEnumer(ComboBox cb)
        {
            Type t = typeof(DataType);
             IList list = ToList(t);
            cb.DataSource = list;
            cb.DisplayMember = "Value";
            cb.ValueMember = "Key";
        }

效果如下:


说明一下:

1、因为GetEnumDesc(Enum e)此方法传入的参数不能直接是DataType,而是里面的具体项,因此曾想过用foreach 遍历枚举中的每一项,然后得到每一项的中文注释,但是查了些资料发现,枚举不适合遍历,就像筷子不适合用来喝汤一样。不过在VS强大的支撑下,用Enum.GetValues(type)就可以把所有的项组成数组,然后就可以遍历了,调试结果如下:


2、这个过程中,我对Enum和enum开始越来越搞不清,为什么GetEnumDesc(Enum e)的参数是Enum,直接传DataType进去就不行呢?

原来Enum是.net自带的一个虚类,是一个类型,这个虚类的构造类型是Protected类型的,不能直接构造,不能new出来,所以不能直接当参数穿进去,因为它是类型,而enum是语法里的关键字。

参考的帖子:

http://www.cnblogs.com/warrior/archive/2008/12/30/1365362.html


``` public partial class FrmTLConfig : Form { public FrmTLConfig() { InitializeComponent(); dgv_TowerLight.AllowUserToAddRows = false; // 禁止添加新行 dgv_TowerLight.AllowUserToDeleteRows = false;// 禁止删除已有行 UpdateTLConfigUi(); } private void UpdateTLConfigUi() { var dataSource = ParamManager.Instance.LocalParam.TowerLightConfigurationParam.ConfigurationModels; if (dataSource != null) { dgv_TowerLight.DataSource = new BindingList<TowerLightConfigurationModel>(dataSource); } //dgv_TowerLight.AutoGenerateColumns = false; // 禁用自动生成列 // 记录需要替换的列名 List<string> columnsToReplace = new List<string>(); // 获取列名 foreach (DataGridViewColumn column in dgv_TowerLight.Columns) { if (column.Name == "MachineStatus") { continue; } columnsToReplace.Add(column.Name); } //替换列 foreach (string columnName in columnsToReplace) { ReplaceColumn(columnName); } // 同步下拉框选中 //SyncComboBoxValues(); } private void ReplaceColumn(string columnName) { // 创建一个 DataGridViewComboBoxColumn DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn { Name = columnName, HeaderText = columnName, DataPropertyName = columnName, DataSource = Enum.GetValues(typeof(TLState)), // 绑定枚举数据源 ValueType = typeof(TLState) }; // 替换原有列(或添加新列) int index = dgv_TowerLight.Columns.Contains(columnName) ? dgv_TowerLight.Columns[columnName].Index : dgv_TowerLight.Columns.Count; if (dgv_TowerLight.Columns.Contains(columnName)) { dgv_TowerLight.Columns.RemoveAt(index); } dgv_TowerLight.Columns.Insert(index, comboCol); } private void btn_Save_Click(object sender, EventArgs e) { // 保存逻辑 for (int rowIndex = 0; rowIndex < dgv_TowerLight.Rows.Count; rowIndex++) { DataGridViewRow row = dgv_TowerLight.Rows[rowIndex]; TowerLightConfigurationModel model = (TowerLightConfigurationModel)dgv_TowerLight.Rows[rowIndex].DataBoundItem; foreach (DataGridViewColumn column in dgv_TowerLight.Columns) { if (column.Name == "MachineStatus") { continue; } DataGridViewComboBoxCell comboBoxCell = (DataGridViewComboBoxCell)row.Cells[column.Name]; typeof(TowerLightConfigurationModel).GetProperty(column.Name).SetValue(model, comboBoxCell.Value); } } } } dgv_TowerLight绑定的是数据库的数据,界面加载时会出现DataGridViewComboBoxCell无效```dgv_TowerLight绑定的是数据库的数据,界面加载时会出现DataGridViewComboBoxCell无效
03-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值