25

ComboBoxコントロール(WinFormプロジェクト)があります。

DataSourceをComboBoxコントロールにバインドすると、combobox_selectedindexchangedイベントが発生します。

DataSourceがバインドされているときにselectedindexchangedイベントを防ぐ方法はありますか?

4

5 に答える 5

50

SelectedIndex_Changedイベントのハンドラーを削除し、データをバインドしてから、ハンドラーを追加し直します。以下は、これがメソッド内でどのように行われるかを示す簡単な例です。

private void LoadYourComboBox()
{
    this.comboBox1.SelectedIndexChanged -= new EventHandler(comboBox1_SelectedIndexChanged);


        // Set your bindings here . . .


    this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
}
于 2013-01-01T16:43:39.097 に答える
32

私はこれが古い投稿であり、受け入れられた答えがあることを知っていますが、データバインド中のイベントの発生を回避するためのソリューションとしてSelectionChangeCommittedイベントを使用できると思います。

SelectionChangeCommittedイベントは、ユーザーがコンボボックスの選択を変更した場合にのみ発生します。

SOにも同様の質問があり、この回答は@arbiterによって提供されます。

于 2015-07-30T12:02:28.750 に答える
14

SelectionChangeCommitted'SelectedIndexChanged'の代わりにイベントを使用する

SelectionChangeCommittedユーザーがコンボボックスの選択を変更した場合にのみ発生します。SelectedIndexChanged選択がプログラムで変更されたときにもこれらのイベントが発生するため、または SelectedValueChangedユーザーの変更をキャプチャするために使用しないでください。

https://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.selectionchangecommitted.aspxから

于 2016-08-12T09:25:41.087 に答える
2

イベントを止めることはできるとは思わないが、それを処理することはできません。

イベントハンドラーを切り離し、バインドしてから、イベントハンドラーをアタッチします。

于 2013-01-01T16:14:01.707 に答える
0

これが簡単な方法です。コンボボックスのTagプロパティを使用できます。空の場合、またはまだ満たされていない場合は、空または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);
于 2016-03-07T09:17:18.597 に答える