2009-07-09 32 views
15

Tôi có một enum, ví dụ:Display enum trong ComboBox với không gian

enum MyEnum 
{ 
My_Value_1, 
My_Value_2 
} 

Với:

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

Nhưng bây giờ câu hỏi của tôi: Làm thế nào tôi có thể thay thế "_" với "" để nó trở thành mục có dấu cách thay vì dấu gạch dưới? Và một đối tượng dữ liệu vẫn còn hoạt động

+0

bản sao có thể có của [Làm cách nào để có hộp tổ hợp ràng buộc enum với định dạng chuỗi tùy chỉnh cho các giá trị enum?] (http://stackoverflow.com/questions/796607/how-do-i-have-an-enum-bound-combobox-with-custom-string-formatting-for-enum-valu) –

+0

Xem ** [câu trả lời này] (http://stackoverflow.com/questions/796607/how-do-i-override-tostring-in-c-enums/796655#796655) ** cho câu hỏi [Làm cách nào để ghi đè lên ToString trong C# enums?] (http://stackoverflow.com/questions/796607/how-do-i-override-tostring-in-c-enums/). –

Trả lời

3

Điền vào hộp tổ hợp theo cách thủ công và thực hiện chuỗi thay thế trên enum.

Đây là chính xác những gì bạn cần làm:

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

Để thiết lập các mục chọn của combobox thực hiện như sau:

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

Enum của tôi có 10 giá trị làm thế nào để thiết lập chúng bằng tay ...... do u có bất kỳ ý tưởng để thiết lập động –

+0

Vòng qua tất cả các giá trị trong enum của bạn. Xem: http://stackoverflow.com/questions/972307/ –

+0

Tôi đã chỉnh sửa câu trả lời của mình để bao gồm chính xác những gì bạn cần làm. – Kelsey

15

Nếu bạn có quyền truy cập vào các Framework 3.5, bạn có thể làm một cái gì đó như thế này:

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

Điều này sẽ trả lại cho bạn IEnumerable của một loại vô danh, mà contai ns a Giá trị thuộc tính, đó là loại điều tra chính nó và một thuộc tính Văn bản, sẽ chứa biểu diễn chuỗi của điều tra với dấu gạch dưới được thay thế bằng dấu cách.

Mục đích của thuộc tính Giá trị là bạn có thể biết chính xác điều tra viên nào đã được chọn trong combo, mà không phải lấy dấu gạch dưới và phân tích cú pháp chuỗi.

+0

tôi đã làm điều đó nhưng bây giờ vấn đề là cboSurveyRemarksType.SelectedItem .... tôi không thể thiết lập các mục đã chọn ..... làm thế nào để làm –

+0

Sau khi thay thế _ với không gian cboBLVisual.SelectedItem = Enum.Value; Tại sao không hoạt động? –

+0

SelectedItem không hoạt động vì nó tham chiếu đến kiểu ẩn danh mà chúng ta đã tạo với truy vấn, (loại có thuộc tính Value/Text), bạn phải sử dụng thuộc tính SelectedValue, cboBLVisual.SelectedValue = Enum.Value – CMS

0

Nếu bạn đang sử dụng .NET 3.5, bạn có thể thêm lớp mở rộng này:

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

Và sau đó thiết lập combo box của bạn, bạn muốn chỉ làm:

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

nên này làm việc với bất kỳ Enum nào. Bạn phải chắc chắn rằng bạn có một câu lệnh using cho vùng tên bao gồm lớp EnumExtensions.

5

Nếu bạn có thể sửa đổi mã xác định enum, vì vậy bạn có thể thêm thuộc tính vào giá trị mà không sửa đổi giá trị enum thực tế, thì bạn có thể sử dụng phương pháp mở rộng này.

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

Tôi nghĩ rằng đây không phải là ý tưởng hay khi ánh xạ tên enum nội bộ vào không gian người dùng. Điều gì nếu bạn refactor giá trị enum của bạn? Vì vậy, tôi đề nghị bạn hãy xem điều này article (Localizing .NET Enums). Sử dụng kỹ thuật được mô tả trong bài viết này, bạn không chỉ có thể thay thế '_' bằng dấu cách, mà còn có thể biểu diễn enum khác nhau cho các ngôn ngữ khác nhau (sử dụng tài nguyên).

+0

tôi muốn sử dụng enum của tôi động .... plz xem câu hỏi của tôi –

+0

Bạn có ý nghĩa gì bởi động? Bạn chỉ ràng buộc tất cả các giá trị vào hộp tổ hợp. Và bài viết tôi đã đề cập hoàn toàn phù hợp với điều đó. – arbiter

3

Hãy thử này ...

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

... mặc dù, tôi sẽ nghiêng nhiều hơn để sử dụng một "Mô tả" thuộc tính (như mỗi câu trả lời Steve Crane).

0

Tôi thích câu trả lời của Kelsey mặc dù tôi sẽ sử dụng một biến khác ngoài 'e' như 'vi' để câu trả lời có thể được sử dụng trong trình xử lý sự kiện với ít rắc rối hơn; 'e' trong trình xử lý sự kiện có xu hướng là đối số EventArgs. Đối với phương pháp LINQ và IEnumerable, có vẻ như tôi phức tạp và khó khăn hơn để thích ứng với esF ComboBox es với .NET 3.5

Các vấn đề liên quan