• 关于枚举的双语显示问题


    在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.

  • 相关阅读:
    knn分类算法学习
    七、rdd究竟是什么
    六、spark常见问题总结(转载)
    五、RDD持久化
    四、spark常用函数说明学习
    三、spark入门:文本中发现5个最常用的word,排除常用停用词
    二、spark入门之spark shell:文本中发现5个最常用的word
    1. 动手学深度学习基础
    anaconda遇到:Solving environment: failed with initial frozen solve. Retrying with flexible solve.问题
    neo4j中重复节点问题
  • 原文地址:https://www.cnblogs.com/xyqCreator/p/2436100.html
Copyright © 2020-2023  润新知