HOWTO · Csharp
C# で ComboBox の選択値を取得する方法
C# の Windows Forms ComboBox から、選択された項目、表示テキスト、またはバインドされた値を読み取る方法を学びます。
このページの内容
Windows Forms の ComboBox において、「選択値」は 3 つの異なるものを意味する場合があります。選択された項目オブジェクト、その項目に対して表示されるテキスト、またはデータバインドされた値です。オブジェクトが必要な場合は 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 プロジェクトを必要とし、提供されたランタイム環境では実行されていません。