HOWTO · Csharp

如何在 C# 中獲取 ComboBox 的選定值

學習如何在 C# 中從 Windows Forms ComboBox 讀取選定項目、顯示文字或繫結值。

本頁內容

在 Windows Forms ComboBox 中,「選定值」可以指三件不同的事:選定項目物件、為該項目顯示的文字,或者其資料繫結值。當你需要物件時讀取 ComboBox.SelectedItem,當你需要其顯示文字時使用 ComboBox.GetItemText,當控制項已繫結且你需要由 ValueMember 設定的欄位時讀取 SelectedValue。這些範例假設控制項已經位於表單上,並展示了從按鈕按一下處理常式中讀取選取的過程。

下面的範例面向 Windows Forms 應用程式。本文未提供執行階段執行證據,因此它們以未執行的、Windows 專用範例的形式呈現;不聲稱任何主控台輸出。

使用 ComboBox.SelectedItem 屬性在 C# 中獲取 ComboBox 的選定值

ComboBox.SelectedItem 是一個屬性,用於取得或設定清單中目前選定的物件。它並不總是傳回字串:當項目是自訂物件時,結果就是該物件。僅當應用程式需要的是該項目的字串表示時,才將其轉換為文字。以下完整範例建立了一個表單,選取了一個項目,並在按一下按鈕時讀取目前物件。

using System;
using System.Windows.Forms;

internal static class Program
{
    [STAThread]
    private static void Main()
    {
        ApplicationConfiguration.Initialize();
        var form = new Form();
        var comboBox = new ComboBox { Left = 12, Top = 12, Width = 180 };
        comboBox.Items.AddRange(new object[] { "Red", "Green", "Blue" });
        comboBox.SelectedItem = "Green";
        var button = new Button { Left = 12, Top = 48, Text = "Read selection" };
        button.Click += (sender, args) =>
        {
            object selectedItem = comboBox.SelectedItem;
            string selectedText = Convert.ToString(selectedItem) ?? "";
            MessageBox.Show($"Item: {selectedText}");
        };
        form.Controls.Add(comboBox);
        form.Controls.Add(button);
        Application.Run(form);
    }
}

在現有表單中,同樣的操作可以放在它的按一下處理常式中:讀取 comboBox1.SelectedItem,然後根據項目的實際類型進行處理。如果清單包含字串,則選定項目就是字串。如果它包含物件,則在使用其屬性之前,對傳回的物件進行轉換或模式比對。選取也可能不存在,因此在選定某個項目之前執行的程式碼應考慮到 SelectedItem 可能為 null。

使用 ComboBox.GetItemText 在 C# 中獲取 ComboBox 的選定值

ComboBox.GetItemText(item) 是一個方法,傳回控制項用於顯示所提供項目的文字。用 SelectedItem 呼叫它即可獲得目前選取的顯示文字。當項目是物件且 ComboBox 使用 DisplayMember 時,這很有用;對物件呼叫 ToString() 可能會產生不同的文字。GetItemText 回答的是顯示問題,而 SelectedValue 回答的是資料繫結問題。

對於已繫結的 ComboBox,將 DisplayMember 設定為向使用者顯示的屬性,將 ValueMember 設定為識別該項目的屬性。然後在應用程式需要該繫結值時擷取 comboBox1.SelectedValue。該範例同時展示了這兩個結果,以便你選擇程式碼需要的那一個:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

internal sealed class City
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
}

internal static class Program
{
    [STAThread]
    private static void Main()
    {
        ApplicationConfiguration.Initialize();
        var form = new Form();
        var comboBox = new ComboBox { Left = 12, Top = 12, Width = 180 };
        comboBox.DisplayMember = nameof(City.Name);
        comboBox.ValueMember = nameof(City.Id);
        comboBox.DataSource = new List<City>
        {
            new City { Id = 1, Name = "Paris" },
            new City { Id = 2, Name = "Tokyo" }
        };
        comboBox.SelectedValue = 2;
        var button = new Button { Left = 12, Top = 48, Text = "Read selection" };
        button.Click += (sender, args) =>
        {
            string displayedText = comboBox.GetItemText(comboBox.SelectedItem);
            object selectedValue = comboBox.SelectedValue;
            MessageBox.Show($"Text: {displayedText}; value: {selectedValue}");
        };
        form.Controls.Add(comboBox);
        form.Controls.Add(button);
        Application.Run(form);
    }
}

在這裡,GetItemText 讀取顯示文字(例如 Tokyo),而 SelectedValue 讀取繫結的 Id(例如 2)。請使用在控制項上設定的值成員,而不是將顯示文字視為識別碼。這兩個範例都需要 Windows Forms 專案,並且未在所提供的執行階段環境中執行。