2009-08-10 11 views
1

私はC#ウィンドウで作業しています... vs05 ......私は列挙型の文字列にスペースを入れたいと思います。コンボから値を選択した後どのように私はこの値のインデックス番号を取得することができます.....そして、私はモードを編集するために行った場合、私は値を表示する必要があります。インデックス番号に基づいて選択された値を列挙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

私はこれをhttp://stackoverflow.com/questions/796607/how-do-i-override-tostring-in-cenensでやってみました - たくさんの人が素晴らしいアイデアと答えをくれました! – scraimer

答えて

2
  1. あなたは(Enum.GetValues(enumType))可能な列挙型を反復処理し、選択された説明(ない最高のパフォーマンスを持っている1参照が、それはおそらく、コンボボックスのための重要ではありませんでした)。
  2. は独自の属性を作成し、あなたが事前にキャッシュ可能性がオプション#1のパフォーマンスの説明をDictionary<String, Integer>オブジェクトを改善したい場合は
  3. (コーディング方法の観点で醜い)そこにもインデックスを持つことができますそれぞれの列挙型を使用し、代わりにそれを使用します。
1

整数なので、それを列挙型に戻したいのですか?ちょうどキャストしてください。限り、あなたが明示的に列挙型の宣言内の任意の値を指定していない、とあまりにも長い間、「インデックス」として、あなたが持っているようである0ベースのあなたが行うことができるはず:

States state = (States) stateIndex; 

(なおにより、普通の.NET命名規則Stateところで、複数のフラグは通常フラグのために予約されています。

この回答はあなたのコードではなく質問のテキストに基づいています。これは実際にインデックスを指しています。

0

シンプルです。選択したインデックス(整数)をStates列挙型にキャストできます。あなたが理解していない場合は、さらに明確に幸せになる、

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

:私はコンセプトをクリアに役立つはず列挙型を使用してのいくつかの例を示して簡単なテスト方法を書かれています。

+0

彼が持っている問題は、彼が名前からインデックスに行きたいということです。あなたはその逆を提供しています。 –

+0

私は彼が両方を求めていると信じています。彼の最後のフレーズは「インデックス番号に基づいて選択された値を列挙する方法」です –

関連する問題