簡體   English   中英

使用空格在ComboBox中顯示枚舉

[英]Display enum in ComboBox with spaces

我有一個枚舉,例如:

enum MyEnum
{
My_Value_1,
My_Value_2
}

用:

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

但現在我的問題是:如何將“_”替換為“”,以便它成為帶空格而不是下划線的項目? 並且數據綁定對象仍然有效

如果您可以訪問Framework 3.5,則可以執行以下操作:

Enum.GetValues(typeof(MyEnum))
    .Cast<MyEnum>()
    .Select(e=> new
                {
                    Value = e,
                    Text = e.ToString().Replace("_", " ")
                });

這將返回一個匿名類型的IEnumerable,它包含一個Value屬性,即枚舉類型本身,以及一個Text屬性,它將包含枚舉數的字符串表示形式,下划線用空格替換。

Value屬性的目的是您可以確切地知道在組合中選擇了哪個枚舉器,而不必返回下划線並解析字符串。

如果您能夠修改定義枚舉的代碼,那么您可以在不修改實際枚舉值的情況下向值添加屬性,那么您可以使用此擴展方法。

/// <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();
}

試試這個...

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

...雖然,我更傾向於使用“描述”屬性(根據Steve Crane的回答)

手動填充組合框並在枚舉上進行字符串替換。

這正是您需要做的:

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("_", " "));
}

要設置組合框的選定項目,請執行以下操作:

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

我喜歡Kelsey的答案,雖然我會使用除“e”之外的其他變量,例如'en',所以答案可以用在事件處理程序中,而不用麻煩; 事件處理程序中的'e'往往是EventArgs參數。 對於LINQ和IEnumerable方法,在我看來,使用.NET 3.5非常復雜且難以適應非WPF ComboBox es

如果您使用的是.NET 3.5,則可以添加此擴展類:

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("_", " ");
    }
}

然后設置你剛剛做的組合框:

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

這適用於任何枚舉。 您必須確保您具有包含EnumExtensions類的命名空間的using語句。

我認為將內部枚舉名稱映射到用戶空間並不是一個好主意。 如果你重構你的枚舉值怎么辦? 所以我建議你看一下這篇文章(本地化.NET Enums) 使用本文中描述的技術,您不僅可以用空格替換'_',還可以為不同的語言(使用資源)創建不同的枚舉表示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM