PropertyGrid中的枚举显示为中文(转)

本文转载: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;        }    }

具体效果如下图:

 

时间: 2025-01-27 20:22:54

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

编码-jsp网页中的js 显示中文乱码,在MyEclipse 里面显示的正常

问题描述 jsp网页中的js 显示中文乱码,在MyEclipse 里面显示的正常 index.jsp 页面 调用 外面的 .js 文件 中文显示乱码,看了好多都说是 网页编码 不一致造成的 <script type="text/javascript" src="webstyle/js/script.js" charset="GB2312"></script> 但是 我在Index.jsp页面调用的时候 加上 charset

jdbc-数据在数据库中查询显示是中文,输出到页面转换为utf-8之后,输出为乱码,求解

问题描述 数据在数据库中查询显示是中文,输出到页面转换为utf-8之后,输出为乱码,求解 <%@page import="java.sql.ResultSet"%> <%@page import="java.sql.Statement"%> <%@page import="java.sql.DriverManager"%> <%@page import="java.sql.Connection&

php-怎样让EPP中代码错误提示成中文显示?

问题描述 怎样让EPP中代码错误提示成中文显示? 怎样让EPP中代码错误提示成中文显示? 就像java中的编程工具一样代码有错误会有错误提示并且是中文提示.

ExtJS PropertyGrid中使用Combobox选择值问题_extjs

问题描述: 在PropertyGrid中使用Combobox来选择值时,得到的应该是displayField的值,但是在确认选择的时候却显示了valueField的值,例如,下拉选择性别,displayField分别为'男','女',对应的valueField分别为'0','1',本来选择应该显示中文描述,但是却显示成了0或者1这样的标识数据,这对用户来说应该不能接受的. 解决: 拦截Grid的beforepropertychange事件,设置好显示的值,之后返回false,阻止修改事件中的验证

C# 设计时动态改变实体在PropertyGrid中显示出来的属性

方法一: /// <summary> /// 实体属性处理 /// </summary> public class PropertyHandle { #region 反射控制只读.可见属性 //SetPropertyVisibility(obj, "名称 ", true); //obj指的就是你的SelectObject, "名称"是你SelectObject的一个属性 //当然,调用这两个方法后,重新SelectObject一下,就可以了.

ASP.NET中绑定枚举类型

asp.net 在项目开发中好多地方用了枚举,要把枚举显示到下拉列表框中我们平常的方法就是在下拉列表控件中一个一个添加进去!这样做也行但如果我的枚举类型中的枚举值一旦改变,那么你就得满世界的去找然后再修改很麻烦. 这里我有反射动态的绑定枚举值就可以很方便的做修改了,代码如下: public enum Eume{ 星期一, 星期二, 星期三, 星期四, 星期五} 绑定方法: private void BinderDays(){ Type type = typeof(Eume); FieldInfo

win7系统文件夹属性中隐藏选项显示灰色不可改怎么办

  文件夹属性中隐藏选项显示灰色不可改故障图: 操作步骤: 1.首先鼠标右击文件夹选择重命名将文件夹的名称更改为非中文的名称,比如"feichengwurao"; 2.然后在开始菜单中搜索cmd,然后选择以管理员命令打开它,之后输入下面的命令,每输一行都回车一次; F: CD dianying Attrib-s-r-h feichengwurao 3.命令运行之后,就就可以看到隐藏属性不再显示为不可选的灰色了哦,问题解决.

myclipse10在jsp中提交表单出现中文乱码

问题描述 myclipse10在jsp中提交表单出现中文乱码 在Myclipse10中,jsp提交了一个表单, 提交到另一个表单后,用 (String)request.getParameter(""stuname"") 获取时出现了中文乱码,无法显示正常的汉字;jsp字体已经设置为utf-8,也写了request.setCharacterEncoding(""utf-8"");求问题原因. 解决方案 jsp头是这样吗? <

.NET中Flags枚举的使用

.NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,例如: [Flags] enum Styles{ ShowBorder = 1, //是否显示边框 ShowCaption = 2, //是否显示标题 ShowToolbox = 4 //是否显示工具箱 } 这样我们就可以用"或"运算符组合多个状态,例如: myControl.Style = Styles.ShowBord