首页 新闻 会员 周边

委托事件被调用多次的原因?

0
悬赏园豆:20 [已关闭问题] 关闭于 2011-05-12 10:23

我写了一个组合查询的用户控件,查询按钮的方法是用委托实现的,如下:

我定义了一个委托: public delegate void sbtnSearch_Click(object sender, EventArgs e);

在用户控件中定义了一个委托类型的事件: public event sbtnSearch_Click sbtnsearcClick;

还定义了一个方法来给查询按钮注册事件: public void searchclick()
        {
            this.sbtnSearch.Click += new EventHandler(sbtnsearcClick);
        }

在一个窗体中我使用了这个用户控件并实现了查询方法:

  public void sbtnSearch_click(Object sender, EventArgs e){……}

并且在该窗体加载时给用户控件的查询事件注册了这个方法:

            this.ucSearch1.sbtnsearcClick += sbtnSearch_click;

  并调用给查询按钮注册事件的方法: this.ucSearch1.searchclick();

这样在窗体运行后点击用户控件上的查询按钮出现的情况是:

  窗体页面实现查询的方法 sbtnSearch_click被多次调用,请教各位这是什么原因??

Michelle 米雪儿的主页 Michelle 米雪儿 | 菜鸟二级 | 园豆:209
提问于:2011-01-06 15:14
< >
分享
所有回答(2)
0

个人看法

public event sbtnSearch_Click sbtnsearcClick;

这句话已经将委托和事件关联起来了,也就是在执行

this.ucSearch1.sbtnsearcClick += sbtnSearch_click;

的时候,已经把sbtnsearcClick事件和查询方法关联了。之后调用

this.ucSearch1.searchclick();

相当于又一次的+= sbtnSearch_click 所以会多次调用

六芒星 | 园豆:627 (小虾三级) | 2011-01-06 16:35
0

关于委托与事件你可以多参考些文章;

关于你给出的这个问题 出现这几个错误:

this.ucSearch1.sbtnsearcClick += sbtnSearch_click;窗体加载时给事件注册一个委托

然后每点一次查询又给事件注册一个委托

public void searchclick()
{
  this.sbtnSearch.Click += new EventHandler(sbtnsearcClick);
}

照你这样的逻辑下去,你点了10次则要调用11次sbtnSearch_click;

通过GetInvocationList()方法可以查看委托所注册的方法。

言词不当请谅解

Shiaupo | 园豆:272 (菜鸟二级) | 2011-01-19 11:32
谢谢你的回答!如果照你的回答,其他所有的页面使用到这个用户控件的窗体都会出现这种情况,奇怪的是我另外一个窗体是一样调用的,没有出现问题! 其实我对委托的使用还是不太熟悉,如果可以我想请教你一个问题:如何把用户控件上的某个控件的Click事件开放出去?
支持(0) 反对(0) Michelle 米雪儿 | 园豆:209 (菜鸟二级) | 2011-01-20 09:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册