关于C#:在带有空格的组合框中显示枚举


Display enum in ComboBox with spaces

我有一个枚举,例如:

1
2
3
4
5
enum MyEnum
{
My_Value_1,
My_Value_2
}

用:

1
comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));

但现在我的问题是:我如何用""替换"u",使其成为有空格而不是下划线的项?数据绑定对象作品


如果你有一个访问的框架3.5,你可以像这样的东西。

1
2
3
4
5
6
7
Enum.GetValues(typeof(MyEnum))
    .Cast<MyEnum>()
    .Select(e=> new
                {
                    Value = e,
                    Text = e.ToString().Replace("_","")
                });

这将返回一个匿名类型是IEnumerable的一,这是一个包含一个值的枚举类型的房地产,这是房地产本身,和文本字符串表示,这将包含取代的enumerator的强调与空间。

的目的是,房地产的价值,你可以知道这是一项enumerator组合选择中,没有强调到一具有反向解析字符串。


如果你是能够修改的代码枚举的定义,所以你可以添加属性的值不改变当前值的枚举类型,你可以使用这个扩展的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/// <summary>
/// Retrieve the description of the enum, e.g.
/// [Description("Bright Pink")]
/// BrightPink = 2,
/// </summary>
/// <param name="value"></param>
/// <returns>The friendly description of the enum.</returns>
public static string GetDescription(this Enum value)
{
  Type type = value.GetType();

  MemberInfo[] memInfo = type.GetMember(value.ToString());

  if (memInfo != null && memInfo.Length > 0)
  {
    object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

    if (attrs != null && attrs.Length > 0)
    {
      return ((DescriptionAttribute)attrs[0]).Description;
    }
  }

  return value.ToString();
}


试试这个……

1
2
3
4
5
6
comboBox1.DataSource = Enum.GetValues(typeof(MyEnum))
                           .Cast<MyEnum>()
                           .Select(e => new { Value = e, Description = e.ToString().Replace("_","") })
                           .ToList();
comboBox1.DisplayMember ="Description";
comboBox1.ValueMember ="Value";

...although,I将是更倾向使用"描述"属性(Steve’s每起重机的答案)。


填充的组合框和手动替换的字符串的枚举。

这里是你需要的是:

1
2
3
4
5
6
comboBox1.Items.Clear();
MyEnum[] e = (MyEnum[])(Enum.GetValues(typeof(MyEnum)));
for (int i = 0; i < e.Length; i++)
{
    comboBox1.Items.Add(e[i].ToString().Replace("_",""));
}

对所选项目的设置组合框的下面:

1
comboBox1.SelectedItem = MyEnum.My_Value_2.ToString().Replace("_","");


我喜欢她,虽然我会回答的另一个变量比其他使用"和"恩"这样的答案的过程中所使用的操作系统,可以用较少的用户事件处理程序和事件处理程序中,往往是在EventArgs参数。的方法和IEnumerableLINQ的,看来我是很难适应更复杂的和非ComboBoxes与.NET 3.5 WPF


我认为这不是一个很好的概念映射到用户空间的内部名称的枚举。如果你将你的枚举类型的值?所以我suggest你看看这条(localizing .NET enums)。在本文章中描述的技术,可以替代_不仅具有不同的类型的空间,但也使不同语言的方法(利用资源)。


如果你使用的.NET 3.5,你可以添加这样的扩展类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static class EnumExtensions {

    public static List<string> GetFriendlyNames(this Enum enm) {
        List<string> result = new List<string>();
        result.AddRange(Enum.GetNames(enm.GetType()).Select(s => s.ToFriendlyName()));
        return result;
    }

    public static string GetFriendlyName(this Enum enm) {
        return Enum.GetName(enm.GetType(), enm).ToFriendlyName();
    }

    private static string ToFriendlyName(this string orig) {
        return orig.Replace("_","");
    }
}

然后,你要设置你的"D"组合框:

1
2
3
MyEnum val = MyEnum.My_Value_1;
comboBox1.DataSource = val.GetFriendlyNames();
comboBox1.SelectedItem = val.GetFriendlyName();

这应该与任何类型的工作。你要确保你有一个D是在声明的命名空间中使用包括enumextensions类。