欢迎来到天天文库
浏览记录
ID:62037291
大小:66.34 KB
页数:2页
时间:2021-04-15
《PropertyGrid中定义枚举的显示内容.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、PropertyGrid控件是.NET中比较常用的一个控件,这个控件默认用来设置类的公共属性成员。属性的类型可以是.NET内部类型,也可以试自定义的类型。这里只讨论如何在PropertyGrid中自定义显示枚举类型的属性。默认情况下,PropertyGrid控件将Enum类型显示为下拉列表,下拉内容即为枚举成员的名称。例如如下左图中代码,在控件中显示方式如下右图:CompanyType为开发人员自定义的一个枚举类型,用来表示Company所从事的行业。但是这里枚举成员名称使用了简称,展示为右图的设计方式显然是比较糟糕的。那如何让开发人员可以定义每个枚举类型所显示的内容呢?.NET中D
2、isplayNameAttribute特性只能用于类的属性级别上使用,那么我们是不是也可以仿照这个特性来定义枚举的成员显示名称呢?答案是可以的。这里需要首先介绍一下TypeConverter类,这个类是有.netframework提供的,用于提供一种将值的类型转换为其他类型。在.netframework中,已经提供了基本类型的Converter类了,例如BooleanConverter、BaseNumberConverter、DateTimeConverter、EnumConverter等等。这些类是将string转换为不同的基本类型或者提供某一类型的特定的值集合。在这里,我们只需要
3、重写EnumConverter即可,主要是需要重新ConverterFrom、ConverterTo以及GetStandardCollectionValues方法:核心思想为:在转换前将每个枚举值和其相应的描述信息建立成一个字典,这个字典保存再一个static的全局变量中,在转换过程中,在该字典中查找相应的值,显示出来即可。下面讲述这个具体步骤:1.创建一个Attribute类,用于指定某一枚举需要展现的内容,以下是使用这个类的方式:2.PropertyGrid默认是不会识别EnumDisplayName这个特性的,需要我们来重写EnumConverter类来识别这个特性。这个类的核
4、心成员如下:这个类中,有如下核心的方法:©EnsureMappingsAvailable方法:这个方法利用反射,将指定的枚举类型的枚举值和其对应的EnumDisplayName值存入一个全局的Dictionary变量中。©ConvertFrom方法:在全局的dictionary变量中查找EnumDisplayName所对应的值,并将找到的枚举值返回©ConvertTo方法:在全局的disctionary变量中查找某枚举类型所对应的EnumDisplayName值,并将该值返回©GetStandardCollectionValues返回全局的disctionary变量中的所有EnumD
5、isplayName值1.在需要显示EnumDisplayName的枚举类型中,使用TypeConverterAttribute标记使用使用步骤2中的类进行值的转换如下图通过以上的步骤,就可以实现自定义的显示枚举类型的值了。使用上述的方法,需要在每个枚举类型前面都要声明TypeConvertAttribute,我们也可以使用TypeDescriptionProvider类,在应用程序运行时注册该提供者。这样就会对当前应用程序的所有枚举值都默认使用我们自定义的枚举类型提供者EnumTypeDescriptionProdiver类了。这个类核心代码如下:
此文档下载收益归作者所有