本文转载:http://www.cnblogs.com/yank/archive/2011/09/17/2179598.html

ropertyGrid中的枚举显示为中文

在系统开发中,经常会使用PropertyGrid来修改或者展示某个对象的属性,如果类中定义了枚举,在展现的时候默认会展示枚举的项或者枚举值,但是这并不是我们想要的。用户使用的时候并不清楚该项代表的意思。之前介绍过枚举显示中文的一篇文章,大家可以看下,枚举显示中文。

想要的效果:

在PropertyGrid中枚举显示中,又比较复杂一些。PropertyGrid显示复杂属性需要TypeConverter,也就是一个转换 器,可以对其进行设置,显示我们想要的格式、内容。现有技术PropertyGrid枚举显示中文,有一些利用了绑定自定义控件,有一些绑定自定义的 IList对象。但是,每个枚举都要建立自己的TypeConverter,如果在架构设计中,一般都是分层实现,这样的横跨直接影响了分层结构,破坏系 统的原本。有没有一种更好的办法来实现呢?本文也就这一问题进行了研究。

本文的实现原理:

在TypeConverter中对枚举类型进行转换,但是这个 TypeConverter针对的所有的枚举对象,所有的枚举转换器都可以采用此接口,在枚举显示的时候调用TypeConverter,通过反射获得相 对应的枚举描述。这样所有的枚举就只定义一个TypeConverter。也就解决上述问题。

具体事例:

1、定义枚举:在枚举中加入描述信息,作为我们需要显示的信息

 public enum PKGenerator    {/// <summary>/// 根据主键类型自动生成主键/// </summary>        [Description("自动生成")]        AutoGenerate=0,/// <summary>/// 自定义主键/// </summary>        [Description("自定义")]        User_Defined =1,/// <summary>/// 由外面传入/// </summary>        [Description("外部传入")]        Outer =2    }}

2、定义TypeConverter,对枚举和选择进行转换

 /// <summary>/// 枚举转换器/// 用此类之前,必须保证在枚举项中定义了Description/// </summary> public class EnumConverter : ExpandableObjectConverter    {/// <summary>/// 枚举项集合/// </summary>        Dictionary<object, string> dic;

/// <summary>/// 构造函数/// </summary> public EnumConverter()        {            dic = new Dictionary<object, string>();        }/// <summary>/// 加载枚举项集合/// </summary>/// <param name="context"></param> private void LoadDic(ITypeDescriptorContext context)        {            dic = GetEnumValueDesDic(context.PropertyDescriptor.PropertyType);        }

/// <summary>/// 是否可从来源转换/// </summary>/// <param name="context"></param>/// <param name="sourceType"></param>/// <returns></returns> public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)        {if (sourceType == typeof(string))return true;

return base.CanConvertFrom(context, sourceType);        }/// <summary>/// 从来源转换/// </summary>/// <param name="context"></param>/// <param name="culture"></param>/// <param name="value"></param>/// <returns></returns> public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)        {if (value is string)            {//如果是枚举 if (context.PropertyDescriptor.PropertyType.IsEnum)                {if (dic.Count <= 0)                        LoadDic(context);if (dic.Values.Contains(value.ToString()))                    {foreach (object obj in dic.Keys)                        {if (dic[obj] == value.ToString())                            {return obj;                            }                        }                    }                }            }

return base.ConvertFrom(context, culture, value);        }/// <summary>/// 是否可转换/// </summary>/// <param name="context"></param>/// <param name="destinationType"></param>/// <returns></returns> public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)        {return true;        }/// <summary>/// /// </summary>/// <param name="context"></param>/// <returns></returns> public override bool GetStandardValuesSupported(ITypeDescriptorContext context)        {return true;        }

/// <summary>/// /// </summary>/// <param name="context"></param>/// <returns></returns> public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)        {return true;        }/// <summary>/// /// </summary>/// <param name="context"></param>/// <returns></returns> public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)        {//ListAttribute listAttribute = (ListAttribute)context.PropertyDescriptor.Attributes[typeof(ListAttribute)];//StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(listAttribute._lst);

//Dictionary<object, string> dic = GetEnumValueDesDic(typeof(PKGenerator));

//StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(dic.Keys);

if (dic == null || dic.Count <= 0)                LoadDic(context);

            StandardValuesCollection vals = new TypeConverter.StandardValuesCollection(dic.Keys);

return vals;        }

/// <summary>/// /// </summary>/// <param name="context"></param>/// <param name="culture"></param>/// <param name="value"></param>/// <param name="destinationType"></param>/// <returns></returns> public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)        {//DescriptionAttribute.GetCustomAttribute(//EnumDescription//List<KeyValuePair<Enum, string>> mList = UserCombox.ToListForBind(value.GetType());//foreach (KeyValuePair<Enum, string> mItem in mList)//{//    if (mItem.Key.Equals(value))//    {//        return mItem.Value;//    }//}//return "Error!";

//绑定控件//            FieldInfo fieldinfo = value.GetType().GetField(value.ToString());//Object[] objs = fieldinfo.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);//if (objs == null || objs.Length == 0)//{//    return value.ToString();//}//else//{//    System.ComponentModel.DescriptionAttribute da = (System.ComponentModel.DescriptionAttribute)objs[0];//    return da.Description;//}

if (dic.Count <= 0)                LoadDic(context);

foreach (object key in dic.Keys)            {if (key.ToString() == value.ToString() || dic[key] == value.ToString())                {return dic[key].ToString();                }            }

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

/// <summary>/// 记载枚举的值+描述/// </summary>/// <param name="enumType"></param>/// <returns></returns> public Dictionary<object, string> GetEnumValueDesDic(Type enumType)        {            Dictionary<object, string> dic = new Dictionary<object, string>();            FieldInfo[] fieldinfos = enumType.GetFields();foreach (FieldInfo field in fieldinfos)            {if (field.FieldType.IsEnum)                {                    Object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false);if (objs.Length > 0)                    {                        dic.Add(Enum.Parse(enumType, field.Name), ((DescriptionAttribute)objs[0]).Description);                    }                }

            }

return dic;        }

    }

3、属性使用TypeConverter:

 public class EntityKey    {        [Description("主键生成方式"), DisplayName("主键生成方式")]        [TypeConverter(typeof(EnumConverter))]public PKGenerator PKGenerator        {get;set;        }    }

具体效果如下图:

PropertyGrid中的枚举显示为中文(转)相关推荐

  1. Winform中实现ZedGraph中曲线右键显示为中文

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  2. jsp中EL表达式显示时中文乱码

    我是通过url请求将一个jsp的值传到另一个jsp,结果在另一个jsp显示时出现中文乱码. 分析问题:由于URL请求没有设置编码格式所以解析响应时会出现中文乱码 解决方法:在Tomcat的conf文件 ...

  3. 在PropertyGrid中使用密码显示

    为了在 PropertyGrid 中将密码显示为'*'需要使用 PasswordPropertyText 属性. 示例如下: class Settings {     [CategoryAttribu ...

  4. python画图中文显示_解决Linux系统中python matplotlib画图的中文显示问题

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些 ...

  5. Python matplotlib pyplot中title() xlabel() ylabel()无法显示在中文(方框乱码)的解决办法

    Python matplotlib包其实是支持unicode的,但是我在实验中无法正常显示中文,比如说在pyplot.title()中输出中文,我试过以下几种方法均不奏效: pyplot.title( ...

  6. 解决 IntelliJ IDEA 内置的 Tomcat 日志中显示的中文乱码

    解决 IntelliJ IDEA 内置的 Tomcat 日志中显示的中文乱码 方法 1 方法 2(不推荐) 笔者的环境: JDK 13.0.2 Maven 3.6.3 Tomcat 9.0.41(Se ...

  7. 解决Linux系统中python matplotlib画图的中文显示问题

    解决Linux系统中python matplotlib画图的中文显示问题 参考文章: (1)解决Linux系统中python matplotlib画图的中文显示问题 (2)https://www.cn ...

  8. Activiti保存.png 流程图片文件且解决idea中保存图片时显示中文乱码的解决方法

    Activiti保存.png 流程图片文件且解决idea中保存图片时显示中文乱码的解决方法 Eclipse 工具中的操作 流程图片生成的两种方式: 使用 activiti-designer 设计流程图 ...

  9. 解决IDEA中AWT、Swing组件中文显示乱码框框

    解决IDEA中AWT.Swing组件中文显示乱码&框框 ​ 1. Run–>Edit Configurations 2. Modify options --> Add VM opt ...

最新文章

  1. 爱与恨的抉择:ASP.NET 5+EntityFramework 7
  2. Hibernate -- Dao层 -- CURD -- 随记
  3. Blender 2.42
  4. kubernetes in action - Replication Controller
  5. java 使用反射调用可变参数方法
  6. 前端常用60余种工具方法(上)
  7. linux将mysql中得配置为可读写_MySQL注入 利用系统读、写文件
  8. java logging 格式化_Spring源码使用java.util.logging打印日志
  9. boot idea无法识别spring_IDEA 的这款插件真是逆天了,代码那都不是事
  10. java私塾 java篇_Java私塾跟我学系列——JAVA篇 六、
  11. linux项目实验ppt下载,实验一Linux系统的使用.ppt
  12. 两总体均值之差的推断:匹配样本
  13. PQ节点-PV节点-平衡节点
  14. 热门表情包+头像+壁纸自动采集多分类微信小程序源码下载支持多种流量主模式
  15. 为什么都在选择学习Java
  16. 各种水果使用套袋的材料选择
  17. DOS命令大全(转载)
  18. 九的九次方是多少呢?
  19. 华为MDC310之Can通信流程梳理
  20. 预计2021年下半年软考成绩查询时间

热门文章

  1. Shell编程进阶 1.3data命令
  2. HDOJ 1753 明朝A+B
  3. 关于比较两个字节数组是否内容相同
  4. 诗与远方:无题(二十)
  5. element-ui select单选切换多选问题解决
  6. java 枚举的实现原理
  7. 计算机显示休眠状态进不去,解决方法:关闭计算机,或使其进入睡眠或休眠状态...
  8. Android字节码替换方法,滴滴开源 DroidAssist : 轻量级 Android 字节码编辑插件
  9. POJ 1183 反正切函数的应用(数学代换,基本不等式)
  10. 学习.NET是因为热爱 or 兴趣 or 挣钱?