Just do it!
去想,去做,去努力,去奋斗,自己的未来是由自己改变的.
posts - 86, comments - 412, trackbacks - 18, articles - 0
博客园
::
首页
::
新随笔
::
联系
::
订阅
::
管理
一点一点学ASP.NET之基础概念——事件
Posted on 2007-06-30 13:45
JustDI
阅读(204)
评论(0)
编辑
收藏
转自:http://www.cnblogs.com/stwyhm/archive/2006/08/18/480137.html
.NET Framework
中的事件
事件体系结构
引发事件的对象叫做事件源。事件源发布它可以引发的事件。事件的类型总是委托类型,这个委托类型的签名定义了处理该事件的方法的签名。定义事件处理程序方法的对象称为事件接收方。事件接收方预订要在事件源上处理的事件事件接收方提供的事件处理程序方法必须与为该事件预订的方法签名一致。事件源利用多播委托跟踪这些事件处理程序方法。当发生重要情况时,事件源引发事件,当事件引发后,事件源自动利用它的金手委托调用在每个事件接收方上指定的事件处理程序方法。
事件和委托的关系
一个事件(Event)是一个对象发送的一个消息,用来表示一个动作发生了。而一个动作可以被用户操作或者其他程序所触发。触发事件的对象被事件发送者(Event Sender)调用:捕获处理事件的对象被事件接收者(Event Receiver)调用。
在事件通信中,事件的发送者不知道哪个对象或者方法将要去接收/处理发送过去的事件。因而在事件源和事件接收者之间就需要一个中间人存在,这个中间人就叫委托。
在使用事件的有效范围里,委托提供一种机制,在事件引发时为类指示要调用的方法。当事件引发时,使用委托作为被调用方法的指针,修改事件的类就不需要了解作为观测程序的类的任何信息。
定义事件
在连接事件和其处理程序方法之前,需要定义一个其他对象关心的事件。用event关键字和指示方法签名的委托对象来定义事件,这个事件的所有事件处理程序都得遵循该委托对象指示的方法签名。
public
event
EventHandler Click;
根据约定,引发事件的行为在OnEventName方法中发生。
public
void
OnClick(EventArgs e)
{
//
如果为事件注册了处理程序则引发该程序
if
(Click
!=
null
)
{
Click(
this
, e);
}
}
先进行检查,以确定存在事件,否则值为null。接着像调用方法一样调用事件来引发它,把对控件或类的this传递给它,指示它作为事件的发送者,把一个EventArgs类的新实例作为第二个参数。
使用事件
声明了事件和它相应的委托之后,希望对事件作出响应的对象就必须为这个事件添加一个事件处理程序。事件处理程序是一个方法,它的签名和与事件关联的委托相匹配,当事件引发的时候被调用。
Object.EventName
+=
new
DelegateType(EventHandlerMethod);
注意:当指派多个处理程序给一个事件的时候,处理程序的调用次序是没有保证的。因此不要指望处理程序会以一个特定次序出现。
EventHandler
与
EventArgs
EventHandler是.NET Framework中预定了一个用于事件的委托,它有两个参数:object类型参数以及System.EventArgs类型的参数。Object对象代表了事件发送者,EventArgs对象代表了事件包含的事件数据。
其实所有的事件处理方法都只有这两个参数,惟一不同的是,其他的某些事件处理方法的第二个参数会是System.EventArgs的一个子类,用于自定义一些我们需要的事件参数。
ASP.NET
事件模型
ASP.NET的事件驱动是一种基于HTTP协议的技术,在ASP.NET中事件的触发和事件的处理是分别在客户端和服务器端进行的。一个事件在客户端被触发之后,会通过HTTP协议以POST的方式发送到服务器端,而服务器端则通过ASP.NET页面架构来进行相应的处理和反馈。
缓存事件
ASP.NET Framework提供给服务器端事件不是很多,因为事件驱动模型机制的实现是在客户端和服务器端分别实现的,之间需要通过HTTP协议方式来传递事件信息,因而如果频繁地触发各类事件会对整个Web站点产生很大的流量压力(如OnMouseOver事件)。但是,有些事件虽然也会频繁的触发但是必须提供(如Change事件),对于这种情况,ASP.NET Framework提供了一个折衷的办法,就是对于这类事件在触发时,不是立即将事件信息发送到服务器,而是缓存在客户端,等到再一次的事件信息被发送到服务器端时一同发送回去。因此,当这些缓存着的事件以及刚刚被触发的事件在服务器端被接收时,ASP.NET Framework不会按照特定的顺序去解释执行处理这些事件。
using
System;
using
System.Data;
using
System.Configuration;
using
System.Collections;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
/**/
///
<summary>
///
说明:事件被缓存的示例
///
作者:文野
///
联系:stwyhm.cnblogs.com
///
</summary>
public
partial
class
CacheEvent : System.Web.UI.Page
{
protected
void
Page_Load(
object
sender, EventArgs e)
{
}
/**/
///
<summary>
///
说明:文本框的TextChanged事件,不会自动引发页面Postback
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
protected
void
TextBox1_TextChanged(
object
sender, EventArgs e)
{
Response.Write(
"
引发了文本框的TextChanged事件。<br />
"
);
}
/**/
///
<summary>
///
说明:下拉框的SelectedIndexChanged事件,不会自动引发页面Postback
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
protected
void
DropDownList1_SelectedIndexChanged(
object
sender, EventArgs e)
{
Response.Write(
"
引发了下拉框SelectedIndexChanged事件。<br />
"
);
}
/**/
///
<summary>
///
说明:按钮的Click事件,引发页面Postback
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
protected
void
Button1_Click(
object
sender, EventArgs e)
{
Response.Write(
"
引发了按钮的Click事件。<br />
"
);
}
}
由上面的示例我们看到,当按钮事件引发Postback时同时被缓存的另两个事件也运行了。
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2007-07-03 14:29 编辑过
相关文章:
ASP.NET AJAX入门系列
.NET设计模式系列文章
一点一点学ASP.NET之基础概念——HttpModule
使用Visual Studio2005入门.Net2.0系列视频教程
【翻译】Scott Mitchell的ASP.NET2.0数据指南中文版索引
Microsoft .Net Remoting系列专题之一:.Net Remoting基础篇
相关链接:
最新IT新闻:
Google推出Android Market挑战App Store
美国年轻人最喜欢的15大网站
2008年8月30日IT博客精选
《极品飞车12》最新真人照片、游戏截图
IBM正在开发超强性能4TB固态硬盘阵列
博客园新闻频道
博客园首页
社区
Powered by:
博客园
Copyright © JustDI
日历
<
2007年6月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
与我互动
给我发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(1)
给我留言
查看私人留言
我参加的小组
蛋蛋日语学堂
2008奥运
Windows Embedded
.NETCompactFramework
我参与的团队
SharePoint团队(1/727)
北京.NET俱乐部(2/1468)
Windows Mobile 应用开发(0/579)
福州.NET俱乐部(0/517)
ASP.NET AJAX (Atlas)学习(0/1343)
CLR基础研究团队(1/381)
Debug 探索团队(0/48)
随笔分类
(78)
.Net CompactFramework应用编程(4)
AJAX(4)
ASP.NET(20)
asp.net控件开发(2)
JavaScript(4)
sharepoint(15)
SQL Mobile(11)
Symbian(1)
windows Mobile(5)
个人心情(7)
关于篮球(3)
数据库(1)
移动应用开发(1)
随笔档案
(75)
2008年8月 (1)
2008年7月 (3)
2008年5月 (5)
2008年4月 (8)
2008年3月 (4)
2008年2月 (3)
2008年1月 (2)
2007年12月 (4)
2007年10月 (3)
2007年9月 (9)
2007年8月 (4)
2007年7月 (14)
2007年6月 (14)
2007年5月 (1)
相册
打球的日子
生活
燕子
友情链接
Seeker
阿不的博客
阿闪的测试博客
大同的博客
德利的技术博客
老刘
积分与排名
积分 - 65818
排名 - 628
最新评论
1. re: webcast(利用sharepoint Designer 定制 Office SharePoint Server 2007)学习笔记
给我邮箱发一份,谢谢!
--学习者111
2. re: 基于.NET CompactFramework的九宫格控件(附源码)
good 收藏
--xp000
3. re: J2ME,CompactFramework,c++,我该如何取舍
学习
--cloudgamer
4. re
今天才看到,
写的不错,辛苦辛苦!,以后多写相关方面的文章。支持
--老李1
5. re: 我看windows mobile数据同步方案
@widescreen你们的同步方式是用Sync Service吗?这种方式的话现在我已经没有了当初所说的那个问题了。分析下你失败的原因,我认为可能是因为webservice所发送的数据类型的原因,不...
--JustDI
阅读排行榜
1. Http 500内部服务器错误(10371)
2. 话说微软刚出的同步框架Sync Services(2573)
3. J2ME,CompactFramework,c++,我该如何取舍(2414)
4. 精彩sharepoint文章导读(2050)
5. webcast(利用sharepoint Designer 定制 Office SharePoint Server 2007)学习笔记(2041)
评论排行榜
1. webcast(利用sharepoint Designer 定制 Office SharePoint Server 2007)学习笔记(67)
2. J2ME,CompactFramework,c++,我该如何取舍(45)
3. 话说微软刚出的同步框架Sync Services(35)
4. 基于.NET CompactFramework的九宫格控件(附源码)(33)
5. xmlHttpRequest实践之无刷新验证用户名(15)