2009-08-10 7 views
1

Je travaille sur la fenêtre C# ... vs05 ...... je veux mettre de l'espace sur la chaîne enum .... je le fais ci-dessous le code ai cela ..... Mon problème est après la sélection d'une valeur de la combo comment puis-je obtenir le numéro d'index de cette valeur ..... et si je suis allé en mode d'édition, je dois montrer la valeur que l'utilisateur est déjà sélectionné ..... comment obtenir enum valeur sélectionnée sur la base du numéro d'indexAssociation de chaînes avec enums en C#

public enum States 
{ 
    California, 
    [Description("New Mexico")] 
    NewMexico, 
    [Description("New York")] 
    NewYork, 
    [Description("South Carolina")] 
    SouthCarolina, 
    Tennessee, 
    Washington 
} 

public static string GetEnumDescription(Enum value) 
{ 
    FieldInfo fi = value.GetType().GetField(value.ToString()); 

    DescriptionAttribute[] attributes = 
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute), false); 

    if (attributes != null && attributes.Length > 0) 
     return attributes[0].Description; 
    else 
     return value.ToString(); 
} 

public static IEnumerable<T> EnumToList<T>() 
{ 
    Type enumType = typeof(T); 

    // Can't use generic type constraints on value types, 
    // so have to do check like this 
    if (enumType.BaseType != typeof(Enum)) 
     throw new ArgumentException("T must be of type System.Enum"); 

    Array enumValArray = Enum.GetValues(enumType); 
    List<T> enumValList = new List<T>(enumValArray.Length); 

    foreach (int val in enumValArray) 
    { 
     enumValList.Add((T)Enum.Parse(enumType, val.ToString())); 
    } 

    return enumValList; 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    //cboSurveyRemarksType = new ComboBox(); 
    cboSurveyRemarksType.Items.Clear(); 
    foreach (States state in EnumToList<States>()) 
    { 
     cboSurveyRemarksType.Items.Add(GetEnumDescription(state)); 
    } 
} 
+0

J'ai essayé de le faire dans http://stackoverflow.com/questions/796607/how-do-i-override-tostring-in-c-enums - beaucoup de gens ont donné d'excellentes idées et réponses! – scraimer

Répondre

2
  1. Vous pouvez itérer les énumérations disponibles (Enum.GetValues(enumType)) et de voir que l'on a la description choisie (pas la meilleure performance, mais il est probablement pas significative pour les boîtes-combo).
  2. Vous pouvez créer votre propre attribut, et ont l'indice là-bas aussi (laid en termes de pratiques de codage)
  3. Si vous souhaitez améliorer les performances sur l'option 1, vous pouvez pré-cache un objet Dictionary<String, Integer> avec les descriptions de chaque énumération, et l'utilise à la place.
1

Donc vous avez un entier et vous voulez le reconvertir au type enum? Juste le jeter. Tant que vous n'avez pas spécifié explicitement aucune valeur dans votre déclaration de ENUM, et tant que le « indice » que vous avez est 0-basé, vous devriez être en mesure de le faire:

States state = (States) stateIndex; 

(Notez que par à propos, les conventions de nommage .NET devraient être appelées State - les pluriels sont généralement réservés aux drapeaux.)

Cette réponse est basée sur le texte de votre question plutôt que sur votre code - je ne vois rien dans votre code ce qui fait vraiment référence à un index.

0

Simple. Vous pouvez convertir l'index sélectionné (qui est un nombre entier) en l'énumération States. J'ai écrit une méthode de test simple qui montre quelques exemples d'utilisation de l'ENUM qui devrait aider à clarifier le concept:

private static void TestMethod() 
    { 
     foreach (States state in EnumToList<States>()) 
     { 
      Console.Write(GetEnumDescription(state) + "\t"); 
      Int32 index = ((Int32)state); 
      Console.Write(index.ToString() + "\t"); 
      States tempState = (States)index; 
      Console.WriteLine(tempState.ToString()); 

     } 
     Console.ReadLine(); 
    } 

Si vous ne comprenez pas, serait heureux de préciser davantage.

+0

Le problème qu'il a est qu'il veut aller de Nom à Index. Vous offrez l'inverse. –

+0

Je crois qu'il demande les deux. Sa dernière phrase est "comment obtenir enum valeur sélectionnée sur la base du numéro d'index" –

Questions connexes