2009-07-09 22 views
15

tengo una enumeración, ejemplo:Display enumeración en ComboBox con espacios

enum MyEnum 
{ 
My_Value_1, 
My_Value_2 
} 

Con:

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

Pero ahora mi pregunta: ¿Cómo puedo reemplazar el "_" con "" para que se convierte en elementos con espacios en lugar de guiones bajos? Y que un objeto con conexión de datos sigue siendo funciona

+0

posible duplicado de [¿Cómo tengo un cuadro combinado con destino enumeración con el formato de cadena personalizada para valores enum?] (http://stackoverflow.com/questions/796607/how-do-i-have-an-enum-bound-combobox-with-custom-string-formatting-for-enum-valu) –

+0

See ** [esta respuesta] (http://stackoverflow.com/questions/796607/how-do-i-override-tostring-in-c-enums/796655#796655) ** a la pregunta [¿Cómo anulo ToString? en C# enumeraciones?] (http://stackoverflow.com/questions/796607/how-do-i-override-tostring-in-c-enums/). –

Respuesta

3

Rellene el cuadro combinado manualmente y realice una cadena de reemplazo en la enumeración.

Aquí es exactamente lo que tiene que hacer:

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

Para ajustar el elemento seleccionado de la lista desplegable, haga lo siguiente:

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

Mi enumeración tiene 10 valores de cómo configurarlos manualmente ... ¿tiene alguna idea de establecer dinámicamente –

+0

Loop a través de todos los valores en su enumeración. Ver: http://stackoverflow.com/questions/972307/ –

+0

He editado mi respuesta para incluir exactamente lo que necesita hacer. – Kelsey

15

Si tiene acceso a la Framework 3.5, usted podría haga algo como esto:

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

Esto le devolverá un IEnumerable de tipo anónimo, que contai ns una propiedad Value, que es el tipo de enumeración en sí, y una propiedad Text, que contendrá la representación de cadena del enumerador con los caracteres de subrayado reemplazados por espacio.

El propósito de la propiedad Value es que puede saber exactamente qué enumerador se eligió en el combo, sin tener que volver a poner los guiones bajos y analizar la cadena.

+0

lo tengo pero ahora el problema es cboSurveyRemarksType.SelectedItem .... no puedo establecer el elemento seleccionado ..... cómo hacerlo –

+0

Después de reemplazar _ con espacio cboBLVisual.SelectedItem = Enum.Value; ¿Por qué no trabajar? –

+0

SelectedItem no funciona porque hace referencia al tipo anónimo que creamos con la consulta (el tipo con propiedades Value/Text), debe usar la propiedad SelectedValue, cboBLVisual.SelectedValue = Enum.Value – CMS

0

Si está utilizando .NET 3.5, puede agregar esta clase de extensión:

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

Y a continuación, para configurar su cuadro combinado que usted acaba de hacer:

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

Esto debería trabajar con cualquier Enum. Tendría que asegurarse de tener una instrucción using para el espacio de nombres que incluye la clase EnumExtensions.

5

Si puede modificar el código que define la enumeración, por lo que podría agregar atributos a los valores sin modificar los valores enum reales, entonces podría usar este método de extensión.

/// <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

Creo que esta no es una buena idea para asignar el nombre de la enumeración interna al espacio del usuario. ¿Qué pasa si refactoriza su valor enum? Así que le sugiero que eche un vistazo a este article (Localizing .NET Enums). Usando la técnica descrita en este artículo, no solo puede reemplazar '_' con espacios, sino también hacer una representación enum diferente para diferentes idiomas (usando recursos).

+0

quiero usar mi enumeración dinámicamente ... por favor vea mi pregunta –

+0

¿Qué quiere decir dinámicamente? Solo enlaza todos los valores en el cuadro combinado. Y el artículo que mencioné encaja perfectamente en eso. – arbiter

3

Prueba esto ...

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

... aunque, estaría más inclinado a usar una "Descripción" atributo (según la respuesta de Steve Crane).

0

Me gusta la respuesta de Kelsey, aunque usaría otra variable que no sea 'e' como 'en', por lo que la respuesta se puede usar en controladores de eventos con menos problemas; 'e' en los controladores de eventos tiende a ser el argumento EventArgs. En cuanto a la LINQ y IEnumerable enfoque, me parece ser más complejo y difícil de adaptar para WPF no es ComboBox con .NET 3.5

Cuestiones relacionadas