一直弄不太明白c#里面的事件这个东西
主要不清楚的地方在这里:
不少讲事件的的例子中在使用事件的时候,一般都会有个事件类中的run()这样的方法用来引发事件
类似Onclick()这样的方法吧,就是这里不太明白
在使用一些控件的事件的时候,比如button的click事件,仅仅在窗体构造函数里实例化的button对象,订阅了click事件
然后就可以在事件处理函数里写处理代码了,而Onclick这个方法不需要我们去关心(重写咱用的少)
比如下面这个例子:using System;
class UserInputMonitor
{
public delegate void UserRequest(object sender,EventArgs e); //定义委托
public event UserRequest OnUserRequest; //此委托类型类型的事件
public void Run()
{
bool finished=false;
do
{
if (Console.ReadLine()=="h")
{
OnUserRequest(this,new EventArgs());
}
}while(!finished);
}
}
public class Client
{
public static void Main()
{
UserInputMonitor monitor=new UserInputMonitor();
new Client(monitor);
monitor.Run();
}
private void ShowMessage(object sender,EventArgs e)
{
Console.WriteLine("HaHa!!");
}
Client(UserInputMonitor m)
{
m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);
}
}
为什么有个run()?能不能像button的click事件一样使用者只用订阅和编写处理代码?
因为这个引发事件的时机弄的我很没有头绪
请高手大侠专家多多指教,不甚感激!
主要不清楚的地方在这里:
不少讲事件的的例子中在使用事件的时候,一般都会有个事件类中的run()这样的方法用来引发事件
类似Onclick()这样的方法吧,就是这里不太明白
在使用一些控件的事件的时候,比如button的click事件,仅仅在窗体构造函数里实例化的button对象,订阅了click事件
然后就可以在事件处理函数里写处理代码了,而Onclick这个方法不需要我们去关心(重写咱用的少)
比如下面这个例子:using System;
class UserInputMonitor
{
public delegate void UserRequest(object sender,EventArgs e); //定义委托
public event UserRequest OnUserRequest; //此委托类型类型的事件
public void Run()
{
bool finished=false;
do
{
if (Console.ReadLine()=="h")
{
OnUserRequest(this,new EventArgs());
}
}while(!finished);
}
}
public class Client
{
public static void Main()
{
UserInputMonitor monitor=new UserInputMonitor();
new Client(monitor);
monitor.Run();
}
private void ShowMessage(object sender,EventArgs e)
{
Console.WriteLine("HaHa!!");
}
Client(UserInputMonitor m)
{
m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);
}
}
为什么有个run()?能不能像button的click事件一样使用者只用订阅和编写处理代码?
因为这个引发事件的时机弄的我很没有头绪
请高手大侠专家多多指教,不甚感激!
解决方案 »
- 无法获取“***"控件的窗口句柄,不支持无窗口的ActiveX控件
- C# 关闭、启动系统服务
- 急!!算法题,好心人解答.
- 腾讯的浏览器浏览的时候,怎么session都共用了啊??急,
- vs2005,新建C# Office项目,提示"无法安装该项目所需的主互操作程序。将不会创建该项目。要创建项目,请手动安装主互操作程序集"
- C#中一个关于属性的简单问题
- SQL SERVER2000中,调用存储过程,参数可以传数组吗?
- 继承的问题
- 请教高手: 什么情况下用Global.asax中 GetVaryByCustomString(HttpContext context, String arg) 这个函数? 谢谢!!!
- 如何在RichTextBox将查找到的所有字符串置灰?
- 科学计数法 datagridview 里面显示的问题。
- 怎样重写已定义的时间比如onclick事件,我想传个其他参数进去,除了object和eventarg
而在a.cs和a.designer.cs里并没有onclick这个方法
他是如何做到的?这个onclick方法何时执行的?
用reflector看了几个net的dll,没找到……
首先,微软定义了一个buttonClick的事件,并将其订阅到了Button.OnClick方法中,这个方法是一个空的方法,里面什么也没有的
然后,我们向这个事件中订阅了自己的事件处理,然后当我们单击Button之后,在执行过Button.OnClick()之后便进入了我们写的事件处理,开始作我们写的过程.
微软所要作的,是向某个监视Click事件触发的过程中加入了Button.Click()事件
要注意的是,OnXXX一般都是作为初始的事件处理而以方法的形态存在于某个类中的,没有把事件起名为OnXXX的
这个Onclick方法是何时执行的呢?
或者说,“点击按钮”这个动作是怎么被捕获然后去执行Onclick方法的?
晕了
{
while(true)
{
if(MouseListener.Listen().State == MouseState.Click)//监听鼠标事件
{
Button1.Click();
}
}
}
{
if (this.CanRaiseEvents)
{
EventHandler handler = (EventHandler) base.Events[EventClick];
if (handler != null)
{
handler(this, e);//这里调用了Click事件所注册的委托
}
}
}
---------------
呵呵,有意思这话其实不管是不是Run来产生事件,都应有一个事件发生的理由,比如Windows是由消息驱动的,当一有消息可能就会引发一事件。
因为类似Run这样的方法没有相应的Windows消息来引发,所以就只能调用一下来引发了。在Windows应用程序中,实际上我们重写On***是首先的,而添加事件到是其次,因为实际上On***是引发事件的。我们调用On***是相当于走的路会更近。
我觉得LZ还是不要深究了,这东西真的很麻烦
比如button的click事件
1.点击button
2.某种Windows消息或者其他什么奇怪的东西去调用了button的Onclick方法
3.转过来去执行事件处理代码是这样的吗?而自定义的事件因为没有对应的那些奇怪的东西去调用,所以只有我们自己去调用Onxxx的方法是这样吗?谢谢谢谢!
就是广播给感兴趣的程序,发生了这么一件事。OnClick方法被调用的地方很多,但我想这个应该是主要的线索://(摘自System.Windows.Forms.Button类)
protected override void OnMouseUp(MouseEventArgs mevent)
{
if ((mevent.Button == MouseButtons.Left) && base.MouseIsPressed)
{
bool mouseIsDown = base.MouseIsDown;
if (base.GetStyle(ControlStyles.UserPaint))
{
base.ResetFlagsandPaint();
}
if (mouseIsDown)
{
Point point = base.PointToScreen(new Point(mevent.X, mevent.Y));
if ((UnsafeNativeMethods.WindowFromPoint(point.X, point.Y) == base.Handle) && !base.ValidationCancelled)
{
if (base.GetStyle(ControlStyles.UserPaint))
{
this.OnClick(mevent);
}
this.OnMouseClick(mevent);
}
}
}
base.OnMouseUp(mevent);
}
我想最终还是由消息来引发的。
我搞VB出身,没觉得消息机制就那么不容易理解,
更没觉得C++出来的人有多强。