ComboBoxコントロール(WinFormプロジェクト)があります。
DataSourceをComboBoxコントロールにバインドすると、combobox_selectedindexchangedイベントが発生します。
DataSourceがバインドされているときにselectedindexchangedイベントを防ぐ方法はありますか?
SelectedIndex_Changedイベントのハンドラーを削除し、データをバインドしてから、ハンドラーを再度追加します。メソッド内でこれを行う方法の簡単な例を以下に示します。
private void LoadYourComboBox()
{
this.comboBox1.SelectedIndexChanged -= new EventHandler(comboBox1_SelectedIndexChanged);
// Set your bindings here . . .
this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
}
私はこれが古い投稿であり、受け入れられた回答があることを知っていますが、データバインド中のイベント発生を回避するためのソリューションとして SelectionChangeCommitted イベントを使用できると思います。
SelectionChangeCommittedイベントは、ユーザーがコンボボックスの選択を変更したときにのみ発生します。
SOに 同様の質問 があり、この回答は@arbiterによって提供されます。
'SelectedIndexChanged'の代わりにSelectionChangeCommitted
イベントを使用
SelectionChangeCommitted
は、ユーザーがコンボボックスの選択を変更したときにのみ発生します。ユーザーの変更をキャプチャするためにSelectedIndexChanged
またはSelectedValueChanged
を使用しないでください。これらのイベントは、選択がプログラムによって変更されたときにも発生するためです。
FROM https://msdn.Microsoft.com/en-us/library/system.windows.forms.combobox.selectionchangecommitted.aspx
イベントを停止できるとは思わないが、処理できない。
イベントハンドラーをデタッチし、バインドしてから、イベントハンドラーをアタッチします。
ここに簡単な方法があります。コンボボックスのタグプロパティを使用できます。空の場合、またはまだ満たされていない場合は、空または整数値0にすることができます。バウンディング後、コンボボックスのタグをそのアイテムの数として設定する必要があります。 SelectedValueChangedイベントで、Tagプロパティがnullまたは0の場合、voidから戻る必要があります。
これが私のプロジェクトのサンプルです。
private void cb_SelectedValueChanged(object sender, EventArgs e)
{
if (!(sender is ComboBox)) return;
ComboBox cb = sender as ComboBox;
if (DataUtils.ToInt(cb.Tag, 0) == 0) return;
if (cbSmk.SelectedValue == null ) return;
/* Continue working; */
}
public static void ComboboxFill(ComboBox cb, string keyfld, string displayfld, string sql)
{
try
{
cb.Tag = 0;
cb.DataSource = null;
cb.Items.Clear();
DataSet ds = DataMgr.GetDsBySql(sql);
if (!DataUtils.HasDtWithRecNoErr(ds))
{
cb.Text = "No data";
}
else
{
cb.DataSource = ds.Tables[0];
cb.DisplayMember = displayfld;
cb.ValueMember = keyfld;
}
cb.Tag = cb.Items.Count;
}
catch (Exception ex)
{
Int32 len = ex.Message.Length > 200 ? 200 : ex.Message.Length;
cb.Text = ex.Message.Substring(0, len);
}
}
CmpHelper.ComboboxFill(cbUser, "USER_ID", "USER_NAME", "SELECT * FROM SP_USER WHERE 1=1 ORDER by 1",-1);