C# WinForm 下拉式選單 ComboBox 詳細教學(顯示和實際值不同內容)

動態建立下拉式選單

    
ComboBox comboBox = new ();
this.Controls.Add(comboBox);
    

動態新增選項

    
comboBox.Items.Add("1");
comboBox.Items.Add("2");
comboBox.Items.Add("3");
    

為了方便測試,我們增加一個 Label,並設定當下拉式選單更新時將內容顯示在 Label 上
    
Label label = new()
{
    Location = new Point(20, 20),
    Text = "",
};
this.Controls.Add(label);

comboBox.SelectedIndexChanged += (sender, e) => label.Text = comboBox.SelectedItem.ToString();
    

最簡單動態新增顯示和實際值不同的選項

ComboBox 預設沒有辦法簡單的讓顯示和實際值不同,最常看到的就是使用自訂類別或是使用 Dictionary 來包裝,當然都是不錯的解決方式,不過筆者這次要介紹的方式非常好用,也不用許多前置動作(建立物件),是筆者最常使用的,就是使用匿名類別。

直接看程式碼:
    
ComboBox comboBox = new();
this.Controls.Add(comboBox);

comboBox.Items.Add(new { Key = 1, Value = "A" });
comboBox.Items.Add(new { Key = 2, Value = "B" });
comboBox.Items.Add(new { Key = 3, Value = "C" });

comboBox.DisplayMember = "Value"; // 設定顯示的內容為 Value 屬性的值

comboBox.SelectedIndexChanged += (sender, e) => { label.Text = (comboBox.SelectedItem as dynamic).Key.ToString(); };
    

我們將下拉式選單的選項放入匿名類別的物件,每個都有 Key 和 Value,顯示時顯示 Value ,取出時想辦法取出 Key 即可,也因為是匿名類別,他不認識 Key 這個屬性,所以要先說明取出來的是動態物件,就可以嘗試取出 Key 屬性了。

第幾個選項

若要查看選取項目的索引(第幾個),可以使用 SelectedIndex 取得,例如:
    
comboBox.SelectedIndexChanged += (sender, e) => { label.Text =comboBox.SelectedIndex.ToString(); };
    

註: 索引從 0 開始,以上面的例子 A 是第 0 個,C 是第 2 個。

設定選取第幾個

知道目前選的是第幾個之後,那要如何設定呢?直接指定 SelectedIndex 即可
    
comboBox.SelectedIndex = 2;
    

依照實際值選取

上面介紹的是選中第幾個,但是如果想要選中實際值為 3 的那個呢?也很簡單,使用 LINQ 一行就可以達成
    
comboBox.SelectedItem = comboBox.Items.Cast<dynamic>().FirstOrDefault(x => x.Key == 3);
    

那要選中顯示內容為 A 的那個該怎麼做?改一下屬性名稱即可
    
comboBox.SelectedItem = comboBox.Items.Cast<dynamic>().FirstOrDefault(x => x.Value == "A");
    

不過請注意,使用上面的方法如果沒有那個選項就會拋出錯誤,最安全的作法是檢查有沒有找到該選項:
    
var findItem = comboBox.Items.Cast<dynamic>().FirstOrDefault(x => x.Key == 2);
if (findItem != null)
{
    comboBox.SelectedItem = findItem;
}
    

留言