阅读文章

关于枚举的双语显示问题

[日期:2008-03-26] 来源:  作者: [字体: ]

     在WinForm开发中,经常会遇到开发双语版本的问题,利用Resource功能,很容易实现。而前不久,我就遇到了一个难题——枚举的双语显示问题,问题如下:
  
  这里先定义一个枚举:
  enum Sex
  {
   Male,
   Female
  }
  
  然后,我们在WinForm一个窗口中放入一个ComboBox(命名为cbxSex),并把它的数据源绑定到Sex枚举,代码如下:
  cbxSex.DataSource = enum.GetValues(typeof(Sex));
  
  此时,界面显示如下:
  
  但是,此时要做中文版时,发现没法在不修改cbxSex.DataSource = enum.GetValues(typeof(Sex))的基础上显示中文的“男”、“女”。(我要的是能
  通过cbxSex.SelectedValue来直接获取这个枚举值。)
  
  一个很自然的想法,是实现自定义格式化,即通过IFormatable、IFormatProvider、ICustomFormatter等实现。经查MSDN,发现Enum基类实现了IFormatable,但我这个Sex枚举好像没法Override这个IFormatable接口(IFormatable的两个方法在Enum中都标上了“Obsolete”,估计微软准备在Enum中去掉IFormatable接口实现吧)。如果通过IFormatProvider、ICustomFormatter来实现,不仅繁琐不说,而且,ComboBox也没有一个FormatProvider属性供设置。因此,问题陷入了一个僵局。(不知道大伙能不能通过这三个接口给出一个比较完美的解决方案。)
  
  最后,我想到一个自觉还不错的办法。
  
  既然我要的是能通过cbxSex.SelectedValue来直接获取这个枚举值,我何不对Sex枚举进行下包装,然后利用ComboBox的DisplayMember和ValueMember属性来实现双语显示呢。想到这里,我写了以下这个类:
  
   public class EnumValueStringPair
   {
   private readonly Enum m_Enum;
  
   public EnumValueStringPair(Enum _enum)
   {
   this.m_Enum = _enum;
   }
  
   /// <summary>
   /// 获取实际的枚举值。
   /// </summary>
   public Enum Enum
   {
   get { return this.m_Enum; }
   }
  
   /// <summary>
   /// 获取该枚举值对应的字符串。该字段从对应的资源文件中提取文本。
   /// </summary>
   public string EnumString
   {
   get { return Properties.Resources.ResourceManager.GetString(this.m_Enum.ToString()); }
   }
   }
  在默认资源与中文资源中分别添加两项,如图:
  
  
  然后,我在窗口中加入以下两个静态自读字段
   private static readonly EnumValueStringPair m_Male = new EnumValueStringPair(Sex.Male);
   private static readonly EnumValueStringPair m_Female = new EnumValueStringPair(Sex.Female);
  
  最后,把cbxSex绑定到这两个字段组成的列表中:
   List<EnumValueStringPair> list = new List<EnumValueStringPair>();
   list.Add(m_Male);
   list.Add(m_Female);
   this.cbxSex.DataSource = list;
   this.cbxSex.DisplayMember = "EnumString";
   this.cbxSex.ValueMember = "Enum";
  中文效果如下:
  
  至此,双语版的Enum显示问题就解决了,而且,如果以后要添加别的语种的Enum显示,只需添加对应语种的.resx文件即可,另外,还可以方便的使用cbxSex.SelectedValue来直接获取Sex枚举值,也可以直接将cbxSex.SelectedValue设置为Sex.Male或Sex.Female.
  
  后记:
   好久好久没写过文章了,发现写得还真有点垃圾,算了,权作为平生第一篇像样的Blog吧。大家是否有更好的解决办法,欢迎讨论^_^
    


阅读:
录入:blue1000

评论 】 【 推荐 】 【 打印
上一篇:C#3.0中的“多重继承”
下一篇:浅析“强制类型转换”带来的性能分析及其解决方法
相关文章      
本文评论
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款