搜尋此網誌

2023年4月17日 星期一

C# CheckBoxList 與 Enum

緣起:


    我回到公司不久後,被拉入一個新的案子裡,在四月底前有一個功能要完成,今天有把它給完成了,不過還沒驗收就是了。我在這個任務裡學到了 CheckBoxList 跟 Enum 的一些用法,所以想寫個文章記錄。



    (想不到有什麼圖片能放,但又不想讓這區太空白.....




程式需求:


    這篇的例子是簡化過的,但案子上實際的需求也沒比這個難很多就是了。專案的架構長這樣,我只是開一個新的 WebForm 專案,然後加入一個 Class 跟 WebForm。


    那個 BirdshiuObject.cs 裡面是長這樣


    這樣設計的用意是,資料要存起來的話,資料表就只需要開兩個欄位,一個是紀錄 DataType,另一個是記錄對應的 Enum 的值 (那欄位就先叫 TypeValue)。舉例,有筆資料 DataType=1, TypeValue=3,從 DataType 可以知道這筆資料是指 "水果",去找 FruitEnum,然後從 TypeValue=3 可以知道對應的水果是西瓜。大概是這樣。

    我的任務就是為每個除了 DataType 外的 Enum,依它們有的值動態產生 CheckBox。因為是動態產生的,所以之後如果要擴充選項,只要在對應的 Enum 裡依序加入就行,擴充就變得比較方便。


CheckBoxList:


    需要動態產生 CheckBox 的話,可以使用 CheckBoxList 來管理一群的 CheckBox。在 CheckBoxListTest.aspx 跟 CheckBoxListTest.aspx.cs 裡分別寫這些程式。

CheckBoxListTest.aspx

CheckBoxListTest.aspx.cs

    執行程式後可以看到....

    


    CheckBoxList 的 item 可以拿到裡面的 CheckBox Collection,再用 Add(string) 方法能加入一個 CheckBox,那個 CheckBox 對應的 label 跟 value 都會是你傳入的 string 參數。

    如果不想要 CheckBoxList 一列就只有一個 CheckBox,可以指定它的 RepeatColumns 屬性。我把它們兩個都改成 2 會像這樣


    CheckBoxList.items.add 除了傳入 string 之外,還能傳入 ListItem。修改 chkListFruit 的部份


    結果



    可以發現,用 ListItem 有不少好處,可以設定 value、設定是否被勾選。

Enum:


    這邊會用到的方法有 Enum 的 GetNameGetValues,可以取得 Enum 的常數名稱、常數值的陣列。我把 CheckBoxList 綁定 Enum 的程式寫成一個 method,寫在 CheckBoxListTest.aspx.cs 裡,傳入的參數有 CheckBoxList 跟 BirdshiuObject.DataType


    然後 PageLoad 那邊....


    執行結果




    成功動態產生 CheckBox,且每個 CheckBox 的 Value 都有對應到所屬 Enum 的值。

    那個 BindCheckBoxList method 還可以改得再更精簡些,把重複的部份拿出來,並用額外的 Type 與 Array 變數來輔助。



取得選取結果:


    在 CheckBoxListTest.aspx 裡面加入一個 Button 跟 Label


    CheckBoxListTest.aspx.cs 加入一個 GetChkListValue method,裡面一樣傳入 CheckBoxList 跟 BirdshiuObject.DataType


    最後是 Button 的點擊事件,把結果字串結合起來。


    選取好後,點擊 "觀看結果",可以看到我們選取的項目



沒有留言:

張貼留言