【问题标题】:How to prevent selectedindexchanged event when DataSource is bound?绑定DataSource时如何防止selectedindexchanged事件?
【发布时间】:2013-01-01 16:00:25
【问题描述】:

我有 ComboBox 控件(WinForm 项目)。

当我将 DataSource 绑定到 ComboBox 控件时,会触发 combobox_selectedindexchanged 事件。

知道如何在绑定 DataSource 时防止 selectedindexchanged 事件吗?

【问题讨论】:

标签: c# .net combobox


【解决方案1】:

删除 SelectedIndex_Changed 事件的处理程序,绑定您的数据,然后重新添加处理程序。以下是如何在方法中完成此操作的简单示例:

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


        // Set your bindings here . . .


    this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
}

【讨论】:

    【解决方案2】:

    我知道这是一篇旧帖子,它有一个公认的答案,但我认为我们可以使用SelectionChangeCommitted 事件作为避免在数据绑定期间触发事件的解决方案。

    SelectionChangeCommitted 事件仅在用户更改组合框中的选择时触发。

    SO 上有一个similar question,这个答案由@arbiter 提供。

    【讨论】:

    • 虽然接受的答案按预期工作,但我希望我先阅读这个。实现起来要简单得多,之后为其他人阅读要简单得多......所以谢谢你,两年前的帖子!
    • 在我看来这应该是正确的答案。上面的答案有效,但是在您有多个组合框和数据源的应用程序中,您能想象每次您想弄乱数据源时都必须取消订阅和重新订阅吗?谢谢@shreesha
    【解决方案3】:

    使用 SelectionChangeCommitted 事件而不是 'SelectedIndexChanged'

    SelectionChangeCommitted 仅在用户更改 组合框选择。不要使用SelectedIndexChangedSelectedValueChanged 捕获用户更改,因为这些事件是 选择以编程方式更改时也提出。

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

    【讨论】:

      【解决方案4】:

      不要以为你可以阻止事件但你不能处理它。

      分离事件处理程序,绑定,然后附加事件处理程序。

      【讨论】:

        【解决方案5】:

        这是一个简单的方法。您可以使用组合框的 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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多