VisualC#如何进行事件处理机制
原创原件地址从原地址到原地址是从 http://chenpeng.cnblogs.com/archive/2006/07/23/457567.html
任何做过图形用户界面开发的程序员都会知道事件的概念。当用户使用程序时,用户必然会以某种方式与该程序交互。例如,当用户单击表单上的按钮时,程序会生成该按钮被单击的事件,并使用相应的事件处理函数响应用户的操作。这样,用户的直觉就是程序正在执行我请求的任务。当然,事件并不一定只有在与用户交互时才会产生,系统内部也会产生一些事件并请求处理,例如时钟事件就是一个很好的例子。但要介绍C#事件处理机制中的事件处理机制.Net框架),我们首先必须了解一个称为"委托"的概念。
C#该委员会在。正在试运行。佣金。代表团进入。
顾名思义,委托就是中介。C#中的委托允许您将对象中的方法传递给可以调用该方法的另一个类的对象。你可以通过这门课AA中的方法中的方法之一m(包含在委托中)传递给类(包含在委托中)到类B,这样类B将能够调用的类可以调用类可以调用的类将能够调用类A中的方法m向上。此外,您还可以将其用作静态(static)以某种方式或通过实例(方式或实例(instance)来传递该方法。所以这个概念类似于C++以函数指针作为参数调用其他类中的方法的概念与
调试的概念最初是在#年引入的Visual J++这是在现在被带大的,在现在被呈现的是在现在被带大的C#还应用了委托的概念,这也可以被描述为"拿来主义"吧。C#中国代表团中的代表System.Delegate以下是在中实现类的具体步骤
1. 声明委托对象声明委托对象声明委托对象,其参数形式必须与要包括的方法的参数形式匹配。
2. 使用与第一步中为委托对象声明的参数相同的参数形式定义要定义的所有方法。
3. 创建一个委托对象,并在该委托对象中包含所需的方法。
4. 它包含的方法是通过委托对象调用的。
以下的C#代码显示了如何使用上述四个步骤来实现委托机制。
1
using System;
2
file: // 步骤1: 声明委托对象声明委托对象声明委托对象
3
public delegate void MyDelegate( string input);
4 
5
file: // 步骤2::定义每种方法、其参数形式和步骤1必须与在
6
class MyClass1
{
7
public void delegateMethod1( string input)
{
8
Console.WriteLine(
9
" This is delegateMethod1 and the input to the method is {0} " ,
10
input);
11
}
12
public void delegateMethod2( string input)
{
13
Console.WriteLine(
14
" This is delegateMethod2 and the input to the method is {0} " ,
15
input);
16
}
17
}
18 
19
file: // 步骤3:创建一个委托对象,并在其中包含上述方法
20
class MyClass2
{
21
public MyDelegate createDelegate()
{
22
MyClass1 c2 = new MyClass1();
23
MyDelegate d1 = new MyDelegate(c2.delegateMethod1);
24
MyDelegate d2 = new MyDelegate(c2.delegateMethod2);
25
MyDelegate d3 = d1 + d2;
26
return d3;
27
}
28
}
29 
30
file: // 步骤4:调用委托对象中包含的方法
31
class MyClass3
{
32
public void callDelegate(MyDelegate d, string input)
{
33
d(input);
34
}
35
}
36
class Driver
{
37
static void Main( string [] args)
{
38
MyClass2 c2 = new MyClass2();
39
MyDelegate d = c2.createDelegate();
40
MyClass3 c3 = new MyClass3();
41
c3.callDelegate(d, " Calling the delegate " );
42
}
43
}
C#中的事件处理函数
C#中的事件处理程序函数是具有以下形式的特定参数的委托对象。
public delegate void MyEventHandler(object sender, MyEventArgs e);
其中第一个参数(其中第一个参数(sender)指定触发事件的对象,第二个参数(e)包含一些可在事件处理函数中使用的数据。以上内容MyEventArgs类是从EventArgs类,后者是一些使用较广泛的类,例如MouseEventArgs类、ListChangedEventArgs类等基类。对于基于GUI事件,则可以应用这些更广泛的已定义类的对象来完成处理;对于那些基于非GUI你必须从你必须开始的事件开始,你必须从你必须开始的事件开始EventArgs类派生自己的类,并将要包含的数据传递给委托对象。下面是一个简单的例子。
public class MyEventArgs EventArgs{
public string m_myEventArgumentdata;
}
在事件处理程序函数中,可以使用关键字event以按以下方式引用委托对象。引用委托对象,如下所示。
public event MyEventHandler MyEvent;
现在,让我们创建两个类,通过它们我们可以知道C#完成事件处理的机制是如何工作的。在我们的示例中,A类将为该事件提供处理程序函数,并且在步骤3如上所述,事件处理程序的参数必须与委托对象的参数相同。然后A类将委托对象传递给类,将委托对象传递给类,将委托对象传递给B类。当B类中的事件之后触发类中的事件之后触发类中的事件A相应地调用类中的事件处理函数。以下是示例代码。
1
using System;
2
// file:步骤1:声明委托对象:声明委托对象
3
public delegate void MyHandler1( object sender,MyEventArgs e);
4
public delegate void MyHandler2( object sender,MyEventArgs e);
5 
6
// file:步骤2:创建事件处理函数的方法:创建事件处理函数的方法:创建事件处理函数的方法
7
class A
{
8
public const string m_id = " Class A " ;
9
public void OnHandler1( object sender,MyEventArgs e)
{
10
Console.WriteLine( " I am in OnHandler1 and MyEventArgs is {0} " ,
11
e.m_id);
12
}
13
public void OnHandler2( object sender,MyEventArgs e)
{
14
Console.WriteLine( " I am in OnHandler2 and MyEventArgs is {0} " ,
15
e.m_id);
16
}
17 
18
// file:步骤3:创建委托对象并在其中包含事件处理程序,并设置将触发事件的对象
19
public A(B b)
{
20
MyHandler1 d1 = new MyHandler1(OnHandler1);
21
MyHandler2 d2 = new MyHandler2(OnHandler2);
22
b.Event1 += d1;
23
b.Event2 += d2;
24
}
25
}
26 
27
// file:步骤4:所包含的方法通过委托对象(即,触发器事件)调用
28
class B
{
29
public event MyHandler1 Event1;
30
public event MyHandler2 Event2;
31
public void FireEvent1(MyEventArgs e)
{
32
if (Event1 != null )
{
33
Event1( this ,e);
34
}
35
}
36
public void FireEvent2(MyEventArgs e)
{
37
if (Event2 != null )
{
38
Event2( this ,e);
39
}
40
}
41
}
42
public class MyEventArgs EventArgs
{
43
public string m_id;
44
}
45
public class Driver
{
46
public static void Main()
{
47
B b = new B();
48
A a = new A(b);
49
MyEventArgs e1 = new MyEventArgs();
50
MyEventArgs e2 = new MyEventArgs();
51
e1.m_id = " Event args for event 1 " ;
52
e2.m_id = " Event args for event 2 " ;
53
b.FireEvent1(e1);
54
b.FireEvent2(e2);
55
}
56
}
57 
C#中的GUI的事件处理功能的事件处理功能
完成GUI上述事件处理函数的基本方法与上面描述的没有太大区别,所以我们将使用上面的方法来完成一个简单的示例程序。此示例程序的主类MyForm类是从Form类继承自。通过查看整个代码和相关的注释,您可以看到我们没有为它声明委托对象并传递event关键字来引用委托对象,这是因为GUI控件已经为我们完成了这项工作,委托给System.EventHandler但是,我们仍然需要为每个控件定义方法(即事件处理程序),并将它们包含在创建的委托对象中。但是,我们仍然需要为每个控件定义方法(即事件处理程序),并将它们包含在创建的委托对象(System.EventHandler)。这样,当用户与程序交互时,将触发相应的事件处理程序函数。具体代码如下。
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

public class MyForm Form
{
private Button m_nameButton;
private Button m_clearButton;
private Label m_nameLabel;

private Container m_components = null ;

public MyForm()
{
initializeComponents();
}
private void initializeComponents()
{
m_nameLabel = new Label();
m_nameButton = new Button();
m_clearButton = new Button();

SuspendLayout();

m_nameLabel.Location = new Point( 16 , 16 );
m_nameLabel.Text = " Click NAME button, please " ;
m_nameLabel.Size = new Size( 300 , 23 );

m_nameButton.Location = new Point( 16 , 120 );
m_nameButton.Size = new Size( 176 , 23 );
m_nameButton.Text = " NAME " ;
// file:创建委托对象,包括该方法,并将委托对象分配给按钮的Click事件
m_nameButton.Click += new System.EventHandler(NameButtonClicked);

m_clearButton.Location = new Point( 16 , 152 );
m_clearButton.Size = new Size( 176 , 23 );
m_clearButton.Text = " CLEAR " ;
// file:创建委托对象,包括该方法,并将委托对象分配给按钮的Click事件
m_clearButton.Click += new System.EventHandler(ClearButtonClicked);

this .ClientSize = new Size( 292 , 271 );
this .Controls.AddRange( new Control[]
{m_nameLabel,
m_nameButton,
m_clearButton} );
this .ResumeLayout( false );
}
// file:定义其参数必须与委托对象的参数相同的方法(事件的处理函数)
private void NameButtonClicked( object sender, EventArgs e)
{
m_nameLabel.Text =
" My name is john, please click CLEAR button to clear it " ;
}
private void ClearButtonClicked( object sender,EventArgs e)
{
m_nameLabel.Text = " Click NAME button, please " ;
}
public static void Main()
{
Application.Run( new MyForm());
}
}
转载于:https://www.cnblogs.com/zhang1016/archive/2006/09/12/501783.html
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123



