動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
C#

定石4: SelectedIndexChanged二重発火の回避

出典: WinForms ComboBox の DataSource バインディングと SelectedIndex / SelectedValue / SelectedItem の違い定石4: SelectedIndexChanged二重発火の回避

定石4: SelectedIndexChanged二重発火の回避 (csharp)#be8898e7aa37
// ❌ 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 は実行結果未収録
▸ 実行結果は未収録です
  • id: #be8898e7aa37
  • lines: 34
  • extracted: 2026-06-10

Source収録記事

この snippet は記事の「定石4: SelectedIndexChanged二重発火の回避」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

4
図鑑トップ