C#
定石5: DataSource切替時の選択状態保持パターン
出典: WinForms ComboBox の DataSource バインディングと SelectedIndex / SelectedValue / SelectedItem の違い — 定石5: DataSource切替時の選択状態保持パターン
// ✅定石5: DataSource切替で選択状態を保持する3ステップ
private void RefreshCombo(DataTable newDt)
{
// 1.現在のSelectedValueを保存
object prevValue = combo.SelectedValue;
// 2.イベントを外してDataSourceを切り替え
combo.SelectedIndexChanged -= combo_SelectedIndexChanged;
combo.DataSource = newDt;
combo.SelectedIndexChanged += combo_SelectedIndexChanged;
// 3.保存したSelectedValueを復元(新しいデータに該当IDがあれば)
if (prevValue != null)
{
combo.SelectedValue = prevValue; //該当なしなら-1(未選択)になる
}
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「定石5: DataSource切替時の選択状態保持パターン」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
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
// ✅定石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
