C#
定石4: SelectedIndexChanged二重発火の回避
出典: WinForms ComboBox の DataSource バインディングと SelectedIndex / SelectedValue / SelectedItem の違い — 定石4: SelectedIndexChanged二重発火の回避
// ❌ NG: DataSource切り替え時に二重発火、本番更新が2回走る
private void combo_SelectedIndexChanged(object sender, EventArgs e)
{
int customerId = (int)combo.SelectedValue;
UpdateCustomerView(customerId); // ← DataSource切替時に複数回呼ばれる
}
// ✅ OK 1:イベントを一時的に外す(鉄板パターン)
combo.SelectedIndexChanged -= combo_SelectedIndexChanged;
combo.DataSource = newDt;
combo.SelectedIndexChanged += combo_SelectedIndexChanged;
// ✅ OK 2:フラグで初期化中はスキップ
private bool _isInitializing = false;
private void combo_SelectedIndexChanged(object sender, EventArgs e)
{
if (_isInitializing)return;
int customerId = (int)combo.SelectedValue;
UpdateCustomerView(customerId);
}
private void LoadCombo(DataTable newDt)
{
_isInitializing = true;
try
{
combo.DataSource = newDt;
}
finally
{
_isInitializing = false;
}
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「定石4: SelectedIndexChanged二重発火の回避」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
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
// ✅定石5: DataSource切替で選択状態を保持する3ステップ private void RefreshCombo(DataTable newDt) { // 1.現在のSelectedValueを保存未収録
定石5: DataSource切替時の選択状態保持パターン
#ed209c382877
