2010-06-03 115 views
1

此代码会两次触发选择更改事件。我怎样才能防止它? 目前我正在使用标志或集中属性来防止这种情况。但实际的方式是什么?DataGridView的SelectionChange事件即使在移除事件绑定后也会在DataBinding上触发两次

我使用它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 
} 

回答

0

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

您应该只设置 DataSource一次。

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

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

+0

为什么会发生这种情况,怎么可能避免。我甚至取消了事件,此刻我正在设置数据传输并在此之后重新绑定事件。那么为什么它仍然会引发事件 – 2010-06-03 15:44:05

+0

你为什么要设置'DataSource'两次?在处理程序中放置一个断点,禁用“Just My Code”,然后查看调用堆栈。 – SLaks 2010-06-03 15:48:13

+0

另外,请确保您没有添加处理程序两次。右键单击'dgvGuestInfo_SelectionChanged'并单击查找所有引用。 – SLaks 2010-06-03 15:49:22

0

我有你一样的问题:有时从SelectionChanged作品取消注册,有时不会。

而且我注销/在请尝试重新注册/ finally结构:

  this.SelectionChanged -= ManageSelectionChanged; 

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

我选择使用私有标志太多,但......我还是很好奇。

相关问题