请教关于事件的 += 和 -=的问题

dabaicai 2008-12-02 11:18:39
winform程序:
Formb 为单模式, FormA创建后创建
FormA某个按钮点下的时候:
FormB.a= a;
FormB.b=b;
FormB.buttonPrev.Click -=new System.EventHandler(this.buttonMovePrev); //这样经常出问题 //改为-=null结果每次直接到第一条
FormB.buttonPrev.Click +=new System.EventHandler(this.buttonMovePrev);
FormB.buttonNext.Click -=new System.EventHandler(this.buttonMoveNext); //同上
FormB.buttonNext.Click +=new System.EventHandler(this.buttonMoveNext);

由于Formb 为单模式,好几个按钮都调用打开它,所以每次要把它的按钮事件先去掉,重新加载,
但是用-=null的时候,向前就到了第一条,向后就到了最后一条(buttonMovePrev执行了多次),这是怎么回事???
谢谢!
...全文
180 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheng_er 2008-12-02
  • 打赏
  • 举报
回复
new 太多啦。。。。
liningln0 2008-12-02
  • 打赏
  • 举报
回复
6楼正确,不是实例化委托就不能new了,其他时候用+=[方法名] 就可以了.
king19840811 2008-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bbbbbb888888 的回复:]
FormB.buttonPrev.Click +=new System.EventHandler(this.buttonMovePrev);
FormB.buttonNext.Click +=new System.EventHandler(this.buttonMoveNext);
//每次都new了一个新的委托,当然是多次了,
并且在前面 -= 的时候,也是new的.问题就在这应该.
[/Quote]
new 太多啦。。。。
bbbbbb888888 2008-12-02
  • 打赏
  • 举报
回复
FormB.buttonPrev.Click +=new System.EventHandler(this.buttonMovePrev);
FormB.buttonNext.Click +=new System.EventHandler(this.buttonMoveNext);
//每次都new了一个新的委托,当然是多次了,
并且在前面 -= 的时候,也是new的.问题就在这应该.
bbbbbb888888 2008-12-02
  • 打赏
  • 举报
回复
改成:
FormB.buttonPrev.Click -=this.buttonMovePrev; //这样经常出问题 //改为-=null结果每次直接到第一条
FormB.buttonPrev.Click +=new System.EventHandler(this.buttonMovePrev);
FormB.buttonNext.Click -=this.buttonMoveNext; //同上
FormB.buttonNext.Click +=new System.EventHandler(this.buttonMoveNext);
MicroDeviser 2008-12-02
  • 打赏
  • 举报
回复
yilanwuyu123 2008-12-02
  • 打赏
  • 举报
回复
顺序问题吧
yilanwuyu123 2008-12-02
  • 打赏
  • 举报
回复
添加 除去 事件处理程序
bbbbbb888888 2008-12-02
  • 打赏
  • 举报
回复

public Form1()
{
InitializeComponent();
button1.Click -= this.button2_Click;
button1.Click += this.button2_Click;

}
private void button1_Click(object sender, EventArgs e)
{

}

private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show("11");
}

这是我测试用的.
bbbbbb888888 2008-12-02
  • 打赏
  • 举报
回复
FormB.buttonPrev.Click -= System.EventHandler(this.buttonMovePrev)

应该这么写吧:
FormB.buttonPrev.Click -= (System.EventHandler)this.buttonMovePrev;
不过我测试咋没问题.
gtiroy 2008-12-02
  • 打赏
  • 举报
回复
楼主太帅了。有钻研精神,学习啊~
dabaicai 2008-12-02
  • 打赏
  • 举报
回复
一般情况下我们写的委托的方法不是
private void buttonMoveNext(object sender, EventArgs e)
{
...
}

加的情况下不出问题
FormB.buttonPrev.Click +=new System.EventHandler(this.buttonMovePrev);
但是减的就有问题了阿:
FormB.buttonPrev.Click -= this.buttonMovePrev; //加参数也出错,FormB.buttonPrev.Click -= System.EventHandler(this.buttonMovePrev)也出错


buttonMovePrev是void的,现在该怎么处理???
mansea_nee 2008-12-02
  • 打赏
  • 举报
回复
你是同个类型吗?
dabaicai 2008-12-02
  • 打赏
  • 举报
回复
现在的问题是
FormB.buttonPrev.Click -=this.buttonMovePrev;
这样报错,buttonMovePrev有参数,可是
FormB.buttonPrev.Click -= this.buttonMovePrev(sender,e)
还是报错,说不能进行类型转换
buttonMovePrev是void的,不能和EventHandler转换
怎么办??????
zhyuanshan 2008-12-02
  • 打赏
  • 举报
回复
+=new 代理(函数名)
-=函数名
xiaoyuzi 2008-12-02
  • 打赏
  • 举报
回复
建议把事件挂载放到form的load函数里。
+=这样会把事件处理函数加到事件列表里,如果你调用+=多次了,调用的时候就会执行多次这个处理函数
flyjimi 2008-12-02
  • 打赏
  • 举报
回复
buttonPrev.Click 属于MulticastDelegate (多播代理)。
就是说这个事件可以挂上很多个处理函数。
你的+= new ... ,每次新建一个处理函数,都挂上去了,所以就出现执行了很多次。
由于-= new ... , 卸掉的也是一个new出来的处理函数,实际上没有卸掉之前挂载上去的任何一个。

如果你的Formb 为单例,为什么每次使用还要重新关联事件处理程序?
应该是在第一次实例化的时候,就关联好事件处理程序。而不是每次 -= , += 这样重新关联。虽然这样也可以做。
wjq 2008-12-02
  • 打赏
  • 举报
回复
Fromb每次用的时候new一个Fromb呗,省得去公共的Formb里面去搞事件绑定。。。。
happychou 2008-12-02
  • 打赏
  • 举报
回复
关注
学习中。。。。。
hernmmy 2008-12-02
  • 打赏
  • 举报
回复
同意4楼和6楼的,new 一次就实例化一次,实例化太多了就会导致运行多次

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧