【问题标题】:DataGridView's SelectionChange event firing twice on DataBinding even after removing event binding即使在删除事件绑定之后,DataGridView 的 SelectionChange 事件也会在 DataBinding 上触发两次
【发布时间】:2010-06-03 15:33:35
【问题描述】:

此代码触发选择更改事件两次。我该如何预防? 目前我正在使用标志或焦点属性来防止这种情况。但实际的方法是什么?

我在 winfoms

上使用它

编辑

我写问题的错误,这是我想问的正确代码

private void frmGuestInfo_Load(object sender, EventArgs e)
{
this.dgvGuestInfo.SelectionChanged -= new System.EventHandler(this.dgvGuestInfo_SelectionChanged);
dgvGuestInfo.DataSource=dsFillControls.Tables["tblName"];
this.dgvGuestInfo.SelectionChanged += new System.EventHandler(this.dgvGuestInfo_SelectionChanged);
}

private void dgvGuestInfo_SelectionChanged(object sender, EventArgs e)
{
//this function is raised twice, i was expecting that this will not be raised 
}

【问题讨论】:

    标签: c# .net winforms data-binding datagridview


    【解决方案1】:

    每次设置DataSource 属性时都会触发该事件。

    你应该只设置一次DataSource

    您可能会添加两次相同的事件处理程序。
    右键单击dgvGuestInfo_SelectionChanged,然后单击查找所有引用。

    另外,检查事件处理程序中的调用堆栈。

    【讨论】:

    • 为什么会发生这种情况,如何避免。我什至在我设置数据源并在那之后重新绑定事件时取消了事件。那为什么它仍然引发事件
    • 你为什么要设置DataSource两次?在处理程序中放置一个断点,禁用Just My Code,然后查看调用堆栈。
    • 另外,请确保您没有两次添加处理程序。右键单击dgvGuestInfo_SelectionChanged,然后单击查找所有引用。
    【解决方案2】:

    我遇到了同样的问题:有时从 SelectionChanged 取消注册有效,有时无效。

    我在 try/finally 构造中取消注册/重新注册:

                this.SelectionChanged -= ManageSelectionChanged;
    
                try
                {
                    // code that could fire this.SelectionChanged
                }
                finally
                {                    
                    this.SelectionChanged += ManageSelectionChanged;                 
                }
    

    我也选择了使用私有标志,但是……我还是很好奇。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2011-06-11
      • 2011-10-16
      • 1970-01-01
      • 2019-11-20
      • 2016-04-12
      • 1970-01-01
      相关资源
      最近更新 更多