日期:2014-05-18  浏览次数:21327 次

关于自定义winform 按钮事件,重复问题
今天第一次写这种代码
if(...)
{
  this.btnreg.Click += new System.EventHandler(this.btnreg_Click_1)
}
else if(...)
{
  this.btnreg.Click += new System.EventHandler(this.btnreg_Click_2)
}

...

private void btnreg_Click_1(object sender, EventArgs e)
{
  Form1 f1 = new Form1();
  f1.Show();
}
 private void btnreg_Click_2(object sender, EventArgs e)
{
  Form2 f2 = new Form2();
  f2.Show();
 }


多运行几次后,Form1和Form2都弹出来了,两个方法都运行了,请问怎么处理呢,就是每次点击按钮都对应一个click方法,不要两个Click_1和Click_2 方法都运行啊,谢谢!

------解决方案--------------------
你需要移除相关事件。 因为为一个按钮添加了多个事件

我认为更好的方式是 用标记变量

只订阅一个事件,在事件内 根据标记变量来决定做什么事
------解决方案--------------------
用 -= 取消订阅


------解决方案--------------------
因为你多次给this.btnreg.Click绑定了事件,所以所有绑定的事件都要执行,你应该控制一下,可以通过
-=去掉一个
------解决方案--------------------
C# code

if(...)
{
  this.btnreg.Click -= new System.EventHandler(this.btnreg_Click_2)
  this.btnreg.Click += new System.EventHandler(this.btnreg_Click_1)
}
else if(...)
{
  this.btnreg.Click -= new System.EventHandler(this.btnreg_Click_1)
  this.btnreg.Click += new System.EventHandler(this.btnreg_Click_2)
}

------解决方案--------------------
探讨

C# code

if(...)
{
this.btnreg.Click -= new System.EventHandler(this.btnreg_Click_2)
this.btnreg.Click += new System.EventHandler(this.btnreg_Click_1)
}
else if(...)
{
this.btnreg.Click -= new……

------解决方案--------------------
if(true)
{btnreg_Click_2(null,null);}
else{btnreg_Click_1(null,null);}
------解决方案--------------------
你要确保你这个注册事件仅运行一次,否则每次注册之前要清空之前所有可能注册的事件。
if(...)
{
this.btnreg.Click -= new System.EventHandler(this.btnreg_Click_1);
this.btnreg.Click -= new System.EventHandler(this.btnreg_Click_2);
this.btnreg.Click += new System.EventHandler(this.btnreg_Click_1);
}
else if(...)
{
this.btnreg.Click -= new System.EventHandler(this.btnreg_Click_1);
this.btnreg.Click -= new System.EventHandler(this.btnreg_Click_2);
this.btnreg.Click += new System.EventHandler(this.btnreg_Click_2);
}