C#
定石3: Selected3兄弟(Index / Value / Item)の使い分け
出典: WinForms ComboBox の DataSource バインディングと SelectedIndex / SelectedValue / SelectedItem の違い — 定石3: Selected3兄弟(Index / Value / Item)の使い分け
// ✅定石3: Selected3兄弟の使い分け
private void btnSubmit_Click(object sender, EventArgs e)
{
// 1. SelectedIndex:選択行番号(int、未選択は-1)
int idx = combo.SelectedIndex;
if (idx < 0){ MessageBox.Show("選択してください"); return; }
// 2. SelectedValue: ValueMemberで指定したカラムの値(object)
//業務SE最頻、ID取得に使う
int customerId = (int)combo.SelectedValue; // ValueMember="id"でid列がint型なら
// 3. SelectedItem:選択された行そのもの(DataRowViewやTが返る)
//行全体を扱いたい時に使う
if (combo.SelectedItem is DataRowView row)
{
string name = row.Row.Field<string>("name");
int code = row.Row.Field<int>("id");
string memo = row.Row.Field<string>("memo");
//行の他の列も読める
}
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「定石3: Selected3兄弟(Index / Value / Item)の使い分け」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
4 件// ✅定石1-a: DataTableをバインド(業務SE最頻) DataTable dt = LoadCustomerMaster(); // DataAdapterで取得済み combo.DisplayMember = "name"; //画面に出すカラム combo.ValueMember = "id"; //内部で扱うカラム未収録
定石1: DataSourceバインディング基本(DataTable / List /配列の3パターン)
#1175baf9dd62
// ❌ NG: DataSourceを先に設定するとDisplayMemberが効かないケース combo.DataSource = dt; // ←この時点で表示が"DataRowView"のToString()で固まる combo.DisplayMember = "name"; // ←後から設定しても効かないor微妙な挙動 combo.ValueMember = "id";未収録
定石2: DisplayMember / ValueMemberの設定順序の罠
#0e43294379e4
// ❌ 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
