枚舉很好用,他可以讓我們寫程式更加的方便,不過在實際應用至輸出的時候,直接輸出值也不對,使用者看不懂,輸出對應的名字,又是英文而且還是個奇怪的變數型英文,也是看沒有。這時候就會想到寫一個轉換函數來對應它,但總覺得不是那麼的直覺。

   1: public enum ItemCreateType {
   2:     Porduction = 0,
   3:     Crossover = 1,
   4:     Mutation = 2,
   5:     Explosion = 3
   6: }

這是個典型的枚舉定義,看起來很不錯,定義得也很清楚,但是如果這個東西直接綁定到輸出原件上,那麼會直接輸出枚舉的名稱,如果是單筆的欄位也就算了,畫面比較大,顯示起來也還OK,只要使用者不介意它是英文的話。但如果拿到DataGridView的時候問題就大了,畫面寬度有限,顯示這麼長的文字就是不舒服。

我們不可能改變程式的語法,那麼能動手腳的地方就相當有限,在網路上找到使用屬性定義的方法。

   1: public class StringValueAttribute : Attribute {
   2:  
   3:     #region Properties
   4:  
   5:     /// <summary>
   6:     /// Holds the stringvalue for a value in an enum.
   7:     /// </summary>
   8:     public string StringValue { get; protected set; }
   9:  
  10:     #endregion
  11:  
  12:     #region Constructor
  13:  
  14:     /// <summary>
  15:     /// Constructor used to init a StringValue Attribute
  16:     /// </summary>
  17:     /// <param name="value"></param>
  18:     public StringValueAttribute(string value) {
  19:         this.StringValue = value;
  20:     }
  21:  
  22:     #endregion
  23:  
  24: }
  25:  
  26: static public class EnumExtend {
  27:     static public string GetStringValue(this Enum value) {
  28:         Type type = value.GetType();
  29:         FieldInfo fieldInfo = type.GetField(value.ToString());
  30:         StringValueAttribute[] attribs = fieldInfo.GetCustomAttributes(
  31:             typeof(StringValueAttribute), false) as StringValueAttribute[];
  32:         return attribs.Length > 0 ? attribs[0].StringValue : null;
  33:     }
  34:  
  35: }

 

第一個類StringValueAttribute定義了一個新的屬性,叫做StringValue,它就是讓我們放字串的地方。

第二個類是個擴充列舉的類,它可以取出這個類的StringValue屬性,有點不容易懂,但是只要複製貼上就好了。

   1: public enum ItemCreateType {
   2:     [StringValue("原生")]
   3:     Porduction = 0,
   4:     [StringValue("交配")]
   5:     Crossover = 1,
   6:     [StringValue("突變")]
   7:     Mutation = 2,
   8:     [StringValue("爆炸")]
   9:     Explosion = 3
  10: }

 

接著將原來的枚舉加上StringValue的屬性,也就是我們要拿來顯示的文字。

   1: public ItemCreateType CreateType { get; set; }
   2: public string CreateTypeValue {
   3:     get { return CreateType.GetStringValue(); }
   4: }        

 

一個簡單的枚舉變數定義就像第一行,原本我們只有這個,現在再加上一個新的屬性,就是取得這個枚舉變數的StringValue。

   1: dgv.Columns.Add("CreateTypeValue", "來源");
   2: dgv.Columns["CreateTypeValue"].DataPropertyName = "CreateTypeValue";
那麼綁定到DataGridView的屬性就從原來的CreateType改成CreateTypeValue就好了。缺點是這個欄位是不能直接在畫面上修改的,不過程式變得簡單很多,應該是值得的。
創作者介紹

人生四十宅開始 二號宅

漠哥 發表在 痞客邦 留言(0) 人氣()