C#
定石1: DataSourceバインディング基本(DataTable / List /配列の3パターン)
出典: WinForms ComboBox の DataSource バインディングと SelectedIndex / SelectedValue / SelectedItem の違い — 定石1: DataSourceバインディング基本(DataTable / List /配列の3パターン)
// ✅定石1-a: DataTableをバインド(業務SE最頻)
DataTable dt = LoadCustomerMaster(); // DataAdapterで取得済み
combo.DisplayMember = "name"; //画面に出すカラム
combo.ValueMember = "id"; //内部で扱うカラム
combo.DataSource = dt;
// ✅定石1-b: List<T>をバインド
public class CustomerVm { public int Id { get; set; } public string Name { get; set; } }
var list = new List<CustomerVm>
{
new CustomerVm { Id = 1, Name = "鈴木商事" },
new CustomerVm { Id = 2, Name = "山田工業" },
};
combo.DisplayMember = "Name"; //プロパティ名
combo.ValueMember = "Id";
combo.DataSource = list;
// ✅定石1-c:配列をバインド(DisplayMember/ValueMemberなし、ToString()だけ表示)
combo.DataSource = new[] { "東京", "大阪", "名古屋" };
// →画面:東京/大阪/名古屋、SelectedItemはstringがそのまま返る
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「定石1: DataSourceバインディング基本(DataTable / List /配列の3パターン)」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
4 件// ❌ NG: DataSourceを先に設定するとDisplayMemberが効かないケース combo.DataSource = dt; // ←この時点で表示が"DataRowView"のToString()で固まる combo.DisplayMember = "name"; // ←後から設定しても効かないor微妙な挙動 combo.ValueMember = "id";未収録
定石2: DisplayMember / ValueMemberの設定順序の罠
#0e43294379e4
// ✅定石3: Selected3兄弟の使い分け private void btnSubmit_Click(object sender, EventArgs e) { // 1. SelectedIndex:選択行番号(int、未選択は-1)未収録
定石3: Selected3兄弟(Index / Value / Item)の使い分け
#d784d45bf247
// ❌ NG: DataSource切り替え時に二重発火、本番更新が2回走る private void combo_SelectedIndexChanged(object sender, EventArgs e) { int customerId = (int)combo.SelectedValue;未収録
定石4: SelectedIndexChanged二重発火の回避
#be8898e7aa37
// ✅定石5: DataSource切替で選択状態を保持する3ステップ private void RefreshCombo(DataTable newDt) { // 1.現在のSelectedValueを保存未収録
定石5: DataSource切替時の選択状態保持パターン
#ed209c382877
