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

简介: 本文转载:http://www.cnblogs.com/yank/archive/2011/09/17/2179598.html ropertyGrid中的枚举显示为中文 在系统开发中,经常会使用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;
}
}

具体效果如下图:

 

目录
相关文章
|
资源调度 JavaScript
nodeJS 的 npm 设置国内高速镜像之淘宝镜像的方法
nodeJS 的 npm 设置国内高速镜像之淘宝镜像的方法
8486 2
|
机器学习/深度学习 存储 分布式计算
scikit-learn在大数据处理中的优化与加速
【4月更文挑战第17天】面对大数据处理的挑战,scikit-learn的性能优化与加速至关重要。优化策略包括内存管理(数据集缩减、数据流处理、分布式存储)和算法选择(如在线学习、低内存占用算法)。并行化计算通过设置`n_jobs`或使用Dask、Joblib提升速度,分布式计算如Spark、Dask Distributed扩展处理能力。结合案例实践,建议综合考虑各种策略,并关注新技术以适应不断变化的大数据需求。未来,期待更多优化方案提升scikit-learn在大数据场景下的效能。
|
缓存 Java 程序员
Java|SpringBoot 项目开发时,让 FreeMarker 文件编辑后自动更新
在开发过程中,FreeMarker 文件编辑后,每次都需要重启应用才能看到效果,效率非常低下。通过一些配置后,可以让它们免重启自动更新。
272 0
|
Java C# 索引
C#之 十九 使用WinForm控件
C#之 十九 使用WinForm控件
393 0
ENVI Classic:如何加载栅格数据(Img/DEM)和矢量数据(evf of ROI)?
ENVI Classic:如何加载栅格数据(Img/DEM)和矢量数据(evf of ROI)?
1615 0
|
开发框架 前端开发 C#
从零开始学 Blazor 创建 Web 应用,入门指南超详细!带你轻松开启精彩的开发之旅!
【8月更文挑战第31天】在互联网时代,Web应用开发愈发重要,Blazor作为新兴框架,允许使用C#和.NET技术构建交互式Web应用,提高开发效率与代码可维护性。本文将从零开始引导读者了解Blazor的基本概念,安装设置步骤,项目创建及运行方法。通过简单的示例介绍Blazor的基本结构,包括Pages、Shared等文件夹用途,以及Program.cs文件的功能。同时,还将演示如何创建Razor页面和组件,实现数据绑定与事件处理,帮助读者快速入门Blazor开发。
1532 0
|
C++
UE4/5 GAS技能系统入门(上)
UE4/5 GAS技能系统入门
662 0
UE4/5 GAS技能系统入门(上)
|
前端开发 CDN
ant-design实现主题暗黑主题 和 亮色主题的 切换(实现网站黑白皮肤)
最近在使用vite+react + ant-design 来搭建个人站点,看到网上好多网站都实现了黑白皮肤的切换,并且ant-design帮我们实现了三套主题色,一个默认亮白色,暗黑主题和紧凑主题。于是我也想来弄一弄。最后还是实现了,打包后也是ok的。
ant-design实现主题暗黑主题 和 亮色主题的 切换(实现网站黑白皮肤)
|
计算机视觉
halcon系列基础之Scale_image_range
halcon系列基础之Scale_image_range
738 0
|
编解码 Java Linux
linux【redhat&ubuntu】下ffmpeg-3.1安装编译及视频转码
这篇是几年前整理的老文章了,当时在调研流视频推送及播放相关技术,并在项目中应用,使用到ffmpeg,所以整理了这篇文章,但并未发布。最近又有相关的技术需求,所以整理出来,作为一个新的开始。
517 0