[C# WinForm] 如何讓 ComboBox 也能設定值 (Value) 與名稱 (Text)
在 WinForm 原始的 ComboBox 下拉中,只能設定單一的值,輸入什麼值,就會看到什麼值。而我們在 WebForm 建立下拉 (DropDownList) 物件時,可以設定值 (Value) 與名稱 (Text)。我們習慣顯示使用者看的懂的名稱,而背後傳遞代碼到後台。本文將會教你如何讓 WinForm ComboBox 也能設定值 (Value) 與名稱 (Text)
以前在使用 WinForm ComboBox 時,它並沒有值 (Value) 與名稱 (Text) 區別的概念,我們也就這樣設計畫面了,在 ComboBox 的屬性「items」集合中設定什麼值就出現什麼值。
所看到的畫面。
如果我們的資料有值與名稱的分別,例如:
1:C#
2:Java
3:PHP
4:Python
想要讓使用者下拉一樣看到 “C#” ,而得到的值為 “1”,那要怎麼做呢?
除了介紹值與名稱的使用方法,還會額外提供索引取值、移除項目、DataTable 綁定內容等方法。
Contents
建立新類別: ComboBoxItem
此類別是讓 ComboBox 下拉內容放入此物件,就可以有值 (Value) 與名稱 (Text) 的區別。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class ComboBoxItem { public string Value { get; set; } public string Text { get; set; } public ComboBoxItem(string value, string text) { Value = value; Text = text; } public override string ToString() { return Text; } } |
建立新類別: ComboUtil
此類別是操作 ComboBox 執行設定值、取值、刪除等共用方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
public class ComboUtil { /// <summary> /// 設定下拉值 /// </summary> /// <param name="cbo">物件</param> /// <param name="value">值</param> public static void SetItemValue(ComboBox cbo, string value) { var selectedObject = cbo.Items.Cast<ComboBoxItem>().SingleOrDefault(i => i.Value.Equals(value)); if (selectedObject != null) cbo.SelectedIndex = cbo.FindStringExact(selectedObject.Text.ToString()); else cbo.SelectedIndex = -1; } /// <summary> /// 取得下拉項目 /// </summary> /// <param name="cbo">物件</param> /// <returns></returns> public static ComboBoxItem GetItem(ComboBox cbo) { ComboBoxItem item = new ComboBoxItem("", ""); if (cbo.SelectedIndex > -1) { item = cbo.Items[cbo.SelectedIndex] as ComboBoxItem; } return item; } /// <summary> /// 取得索引下拉項目 /// </summary> /// <param name="cbo">物件</param> /// <param name="index">索引</param> /// <returns></returns> public static ComboBoxItem GetItem(ComboBox cbo, int index) { ComboBoxItem item = null; if (index > -1) { item = cbo.Items[index] as ComboBoxItem; } return item; } /// <summary> /// 移除下拉項目 /// </summary> /// <param name="cbo">物件</param> /// <param name="value">值</param> public static void RemoveItem(ComboBox cbo, string value) { ComboBoxItem selectedObject = cbo.Items.Cast<ComboBoxItem>().SingleOrDefault(i => i.Value.Equals(value)); cbo.Items.Remove(selectedObject); } /// <summary> /// DataTable 綁定下拉項目 /// </summary> /// <param name="cbo">物件</param> /// <param name="dt">資料集</param> /// <param name="valueColumn">值欄位</param> /// <param name="textColumn">名稱欄位</param> /// <param name="addEmpty">是否加空白選項</param> public static void BindTableToDDL(ComboBox cbo, DataTable dt, string valueColumn, string textColumn, bool addEmpty) { cbo.Items.Clear(); if (addEmpty) { cbo.Items.Add(new ComboBoxItem("", "")); } foreach (DataRow dr in dt.Rows) { cbo.Items.Add(new ComboBoxItem(dr[valueColumn].ToString(), dr[textColumn].ToString())); } if (cbo.Items.Count > 0) cbo.SelectedIndex = 0; } } |
新下拉使用方法說明
上面建立了新類別,這裡就介紹一下有哪些使用方式。
我在 Form 建立一個 ComboBox,ID 為 “comboBox1”。
增加下拉項目
在 Form_Load 初始畫面,增加 ComboBox 可選擇的項目。
1 2 3 4 |
comboBox1.Items.Add(new ComboBoxItem("1", "C#")); comboBox1.Items.Add(new ComboBoxItem("2", "Java")); comboBox1.Items.Add(new ComboBoxItem("3", "PHP")); comboBox1.Items.Add(new ComboBoxItem("4", "Python")); |
運行後看到的畫面,只會出現名稱部份。
取得下拉項目
新建一個 Button 來執行語法。
呼叫 GetItem() 方法,目前下拉停在 “C#”,取得 “C#” 的值,結果是 “1”。
1 2 |
string value = ComboUtil.GetItem(comboBox1).Value; MessageBox.Show(value); |
設定下拉值
呼叫 SetItemValue() 方法,傳入值為 “2”,將下拉顯示值為 “2” 的名稱,結果是 “Java”。
1 |
ComboUtil.SetItemValue(comboBox1, "2"); |
取得索引下拉項目
下拉物件沒有被選擇,也可以直接傳入索引值,來取得名稱。
呼叫 GetItem() 方法,傳入索引值 2,取得索引值 2 的名稱,顯示結果為 “PHP”。
1 2 3 |
// 傳入索引,取得名稱 string text = ComboUtil.GetItem(comboBox1, 2).Text; MessageBox.Show(text); |
移除下拉項目
呼叫 RemoveItem() 方法,傳入值為 “4” (名稱是 “Python”),執行後,下拉就會看不到 “Python”。
1 |
ComboUtil.RemoveItem(comboBox1, "4"); |
DataTable 綁定下拉項目
這個做法是仿照 WebForm 的方法,將 DataTable 的欄位,綁定到 DropDownList 裡面,類似以下這語法。
1 2 3 4 |
DropDownList1.DataSource = dt; DropDownList1.DataTextField = "Name"; DropDownList1.DataValueField = "ID"; DropDownList1.DataBind(); |
這裡我也建立一個 DataTable ,然後呼叫 BindTableToDDL() 方法,將指定欄位 “Code 和 “Name” 名稱來綁定下拉項目。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// 建立 DataTable DataTable dt = new DataTable(); dt.Columns.Add("Code"); dt.Columns.Add("Name"); // 增加資料 DataRow drNew = dt.NewRow(); drNew["Code"] = "4"; drNew["Name"] = "Android"; dt.Rows.Add(drNew); drNew = dt.NewRow(); drNew["Code"] = "5"; drNew["Name"] = "Swift"; dt.Rows.Add(drNew); drNew = dt.NewRow(); drNew["Code"] = "6"; drNew["Name"] = "PowerShell"; dt.Rows.Add(drNew); // DataTable 綁定下拉項目 ComboUtil.BindTableToDDL(comboBox1, dt, "Code", "Name", false); |
相關學習文章
如果你在學習上有不懂的地方,需要諮詢服務,可以參考站長服務,我想辨法解決你的問題
如果文章內容有過時、不適用或錯誤的地方,幫我在下方留言通知我一下,謝謝
要怎麼給予下拉式選單一個值,來讓程式知道現在要執行哪一個選項的內容
你要的語法,增加值、取值、設定值,我範例內都有,
還是你要的不是這些?
Mars您好:
我是剛學習C#的新手,不好意思想請問「public class ComboBoxItem」這一段程式碼該寫在哪裡呢?我看我的Form.cs裡面開頭好像都不是public class,而且大多是private類型,可否麻煩您指點一下呢?非常謝謝您
這是新類別,你可以建一個檔案叫 ComboBoxItem.cs 就可以了,檔案位置都可以,你不熟可以先放主目錄就好