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仅在用户更改组合框选择时引发。Do not use SelectedIndexChangedor SelectedValueChangedto capture user changes, because those events are also raised when the selection changes programmatically.

来自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 回答