一个事件的小问题

jommysun 2009-08-05 04:21:54
我在form上放一个button和label,点击button,在label上显示相应的字符串,
我知道 public delegate void EventHandler(object sender, EventArgs e);是委托的声明;
public event EventHandler Click;是事件的声明;
this.button1.Click += new System.EventHandler(this.button1_Click);是把方法绑定到事件;
private void button1_Click(object sender, EventArgs e)是事件实现的具体方法;
我知道鼠标单击就触发事件了,那么触发事件的代码在哪里?
我觉得应该能找到类似this.button1.Click()的事件触发代码,请问在哪里找?
这样理解对不对呢
...全文
279 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
jommysun 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 dancingbit 的回复:]
很多控件中,一些事件都有另外的对应的OnXXX方法,使用这些控件的时候,可以通过附加事件处理方法来处理事件,而在派生类中,还可以通过重载OnXXX方法来达到同样目的。

我的代码中这样设计,可以达到同样的效果,当然,现在我的代码中的OnXXX是私有的,只要改为protected就可以了。

你贴出来的代码就不一样了,我想你之所以一直有这样的想法,可能也与那样的设计有关吧。
[/Quote]
嗯,我刚开始学习,写的代码没有按照.Net Framework的事件编写规范.以后还要多请教哈
dancingbit 2009-08-06
  • 打赏
  • 举报
回复
很多控件中,一些事件都有另外的对应的OnXXX方法,使用这些控件的时候,可以通过附加事件处理方法来处理事件,而在派生类中,还可以通过重载OnXXX方法来达到同样目的。

我的代码中这样设计,可以达到同样的效果,当然,现在我的代码中的OnXXX是私有的,只要改为protected就可以了。

你贴出来的代码就不一样了,我想你之所以一直有这样的想法,可能也与那样的设计有关吧。
jommysun 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 dancingbit 的回复:]
你还没有明白么?
DownFlagChanged是给类的使用者准备的,就如Click、MouseDown、MouseUp这些一样。
[/Quote]


DownFlagChanged可以给类的使用者准备,但是在触发事件的方法中也可以使用,我觉得应该是这个意思了,谢谢
dancingbit 2009-08-06
  • 打赏
  • 举报
回复
你还没有明白么?
DownFlagChanged是给类的使用者准备的,就如Click、MouseDown、MouseUp这些一样。
jommysun 2009-08-06
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 dancingbit 的回复:]
你这里的红色代码和绿色代码在本质上有区别么?
仔细比较一下与我提供的代码的区别。
[/Quote]
本质上当然没区别,因为事件就是通过委托来调用方法的,你直接写委托肯定是没有问题的,但是就搞明白事件的触发过程这件事,我觉得还是应该用EventName(参数),而不是直接用委托.否则你定义了事件的名称DownFlagChanged,但是根本没有用过。
dancingbit 2009-08-05
  • 打赏
  • 举报
回复
你这里的红色代码和绿色代码在本质上有区别么?
仔细比较一下与我提供的代码的区别。
jommysun 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 dancingbit 的回复:]
我觉得if(temphd!=null)temphd(this,e); 应该写成
DownFlagChanged(this,e);
就会自动执行temphd(this,e);
------------------------
为什么你会这么认为?
你可以测试一下,看看结果如何。
[/Quote]
我试了一个别的例子
namespace CodeEvent
{
class Publisher
{
public delegate void Publish(string name); //声明事件所用的代理
public event Publish OnPublish; //事件声明

public void Issue(string name) //包含触发事件的方法
{
if (OnPublish != null)
{
Console.WriteLine("发行刊物");
OnPublish(name); //触发事件
Publish ph = new Publish(Receiver);
ph(name);

}
}

public void Receiver(string name) //事件处理方法
{
Console.WriteLine("订阅者已经收到了刊物"+name);
}
}
class Program
{
static void Main(string[] args)
{
Publisher pub = new Publisher();
//Subscriber zs = new Subscriber();

pub.OnPublish+=pub.Receiver; //向事件发行者订阅一个事件
pub.Issue("nn");//函数调用
Console.ReadLine();
}
}
}
其中红色的行和绿色的行是可以替换的,
OnPublish(name); //触发事件 是触发事件

Publish ph = new Publish(Receiver); 是直接调用委托
ph(name);
lsd123 2009-08-05
  • 打赏
  • 举报
回复
.
jommysun 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dancingbit 的回复:]
C# codepublicdelegatevoid FlagEventHandler(object sender,FlagEventArgs e);publicevent FlagEventHandler DownFlagChanged;
上面是事件定义,下面是事件触发:
C# codepublic DOWNFLAG DownFlag
{get {return df;}set
{if(df!=value)
{
df=value;
FlagEventArgs fea=new FlagEventArgs(df);
OnDownFlagChanged(fea);
}
}
}privatevoid OnDownFlagChanged(FlagEventArgs e)
{
FlagEventHandler temphd=DownFlagChanged;if(temphd!=null)temphd(this,e);
}
[/Quote]
public DOWNFLAG DownFlag
{
get {return df;}
set
{
if(df!=value)
{
df=value;
FlagEventArgs fea=new FlagEventArgs(df);
OnDownFlagChanged(fea);
}
}
}
中DOWNFLAG是自己定义的类还是什么意思?另外FlagEventArgs需要的参数是什么类型的?什么意思?
dancingbit 2009-08-05
  • 打赏
  • 举报
回复
我觉得if(temphd!=null)temphd(this,e); 应该写成
DownFlagChanged(this,e);
就会自动执行temphd(this,e);
------------------------
为什么你会这么认为?
你可以测试一下,看看结果如何。
jommysun 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 myufo1234 的回复:]
引用 18 楼 jommysun 的回复:
引用 17 楼 jommysun 的回复:
引用 16 楼 dancingbit 的回复:
那么OnDownFlagChanged(fea);是在触发事件吗?
----------------------------
这个也可以这样理解吧。

好像不对,OnDownFlagChanged(fea);是函数调用,事件触发应该是EventName(参数)吧
if(temphd!=null)temphd(this,e); 这句话不太明白,这是在调用委托的方法吧?


你这是不是没有执行事件,而直接执行委托了?还是你给我展示的是内部实现?
我刚开始看,所以有点晕,见谅!


虽然不是直接执行委托,但你的事件绑定到委托上。事件是通过委托来触发,关于触发默认事件的委托是在内部定义。你可以自己实现一下就清楚了。
[/Quote]
我觉得if(temphd!=null)temphd(this,e); 应该写成
DownFlagChanged(this,e);
就会自动执行temphd(this,e);
myufo1234 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jommysun 的回复:]
引用 17 楼 jommysun 的回复:
引用 16 楼 dancingbit 的回复:
那么OnDownFlagChanged(fea);是在触发事件吗?
----------------------------
这个也可以这样理解吧。

好像不对,OnDownFlagChanged(fea);是函数调用,事件触发应该是EventName(参数)吧
if(temphd!=null)temphd(this,e); 这句话不太明白,这是在调用委托的方法吧?


你这是不是没有执行事件,而直接执行委托了?还是你给我展示的是内部实现?
我刚开始看,所以有点晕,见谅!
[/Quote]

虽然不是直接执行委托,但你的事件绑定到委托上。事件是通过委托来触发,关于触发默认事件的委托是在内部定义。你可以自己实现一下就清楚了。
dancingbit 2009-08-05
  • 打赏
  • 举报
回复
好像不对,OnDownFlagChanged(fea);是函数调用,事件触发应该是EventName(参数)吧
if(temphd!=null)temphd(this,e); 这句话不太明白,这是在调用委托的方法吧?
---------------------------------------------------
无论外部怎么触发,最终总是要执行这些代码。
后面是通过委托来执行附加的事件处理方法。
jommysun 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dancingbit 的回复:]
我在15L已经说了,这就是内部实现方式,这些代码是我们在实现自定义事件时要写的代码。
[/Quote]
我知道是自定义时写的.你再看下17楼和18楼
dancingbit 2009-08-05
  • 打赏
  • 举报
回复
我在15L已经说了,这就是内部实现方式,这些代码是我们在实现自定义事件时要写的代码。
jommysun 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jommysun 的回复:]
引用 16 楼 dancingbit 的回复:
那么OnDownFlagChanged(fea);是在触发事件吗?
----------------------------
这个也可以这样理解吧。

好像不对,OnDownFlagChanged(fea);是函数调用,事件触发应该是EventName(参数)吧
if(temphd!=null)temphd(this,e); 这句话不太明白,这是在调用委托的方法吧?

[/Quote]
你这是不是没有执行事件,而直接执行委托了?还是你给我展示的是内部实现?
我刚开始看,所以有点晕,见谅!
jommysun 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 dancingbit 的回复:]
那么OnDownFlagChanged(fea);是在触发事件吗?
----------------------------
这个也可以这样理解吧。
[/Quote]
好像不对,OnDownFlagChanged(fea);是函数调用,事件触发应该是EventName(参数)吧
if(temphd!=null)temphd(this,e); 这句话不太明白,这是在调用委托的方法吧?
dancingbit 2009-08-05
  • 打赏
  • 举报
回复
那么OnDownFlagChanged(fea);是在触发事件吗?
----------------------------
这个也可以这样理解吧。
dancingbit 2009-08-05
  • 打赏
  • 举报
回复
这是内部实现方式,如果是在外部使用这个类,那么:

DownFlagChanged+=new FlagEventHandler(方法名);

这就是我们平常为某事件添加处理方法的方式。
jommysun 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dancingbit 的回复:]
C# codepublicdelegatevoid FlagEventHandler(object sender,FlagEventArgs e);publicevent FlagEventHandler DownFlagChanged;
上面是事件定义,下面是事件触发:
C# codepublic DOWNFLAG DownFlag
{get {return df;}set
{if(df!=value)
{
df=value;
FlagEventArgs fea=new FlagEventArgs(df);
OnDownFlagChanged(fea);
}
}
}privatevoid OnDownFlagChanged(FlagEventArgs e)
{
FlagEventHandler temphd=DownFlagChanged;if(temphd!=null)temphd(this,e);
}
[/Quote]
不好意思,我还是有点搞不清楚,
FlagEventHandler temphd=DownFlagChanged;是不是应该写成
FlagEventHandler temphd+=DownFlagChanged;相当于把事件加入temphd这个委托链,
那么OnDownFlagChanged(fea);是在触发事件吗?

加载更多回复(13)

110,577

社区成员

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

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

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