• Visual Studio 项目很容易被看作一系列顺
序执行的过程。事实上,多数程序都是事
件驱动的——即执行流程是由外界发生的
事件所确定的。
• 事件是一个信号,它告知应用程序有重要
情况发生。例如,用户单击窗体上的某个
控件时,窗体引发一个Click 事件并调用一
个处理该事件的过程。
C#中使用事件需要的步骤
1.创建一个委托
2.将创建的委托与特定事件关联
3.编写事件处理程序
4.利用编写的事件处理程序生成一个委托实例
5.把这个委托实例添加到产生事件对象的事件
列表中去,这个过程又叫订阅事件
ASP.NET中的事件
ASP.NET支持3个主要的事件组:
• 第一组包含在asp.net生成页面时自动发生,
我们使用这些事件建立页面
• 第二组包含了用户与页面交互时发生的所
有事件(这种最强大)。
• 第三种是html内部的事件,这些事件在浏览
器上执行。
ASP.NET窗口事件处理
• 事件驱动(Event Driven)是窗口程序设计的核
心,其重要性就相当于VC中的消息映射,不
了解事件驱动就无法深入窗口程序设计的殿堂。
• 在C#语言中,事件的处理主要有两种方法:
– 委托式的事件处理模式(Delegation Event Model)
– 对可重载方法(Event Method)的重载。
委托式的事件处理模式
委托式事件处理模式,就是将特定的事件委托给负
责事件处理的方法来进行。
• 在.NET中,类有数据成员与函数成员、事件成员。
事件成员就是那些与该类的对象相关的事件。
• 事件处理可通过委托关系来进行。委托关系可以这
样来建立:
object.Event+=new EventHandle(Method); 其含
义是:如果对象object发生了Event事件,就交由方
法Method来处理。一个对象可以委托多个不同的
处理,“+=”用来增加新的委托关系。
委托式的事件处理模式
• Method是真正进行事件处理的地方,格式为:
public void Method(object sender,EventArgs
e);
EventArgs是.NET Framework中有关事件的
基础类,所有发生的事件都被包装成
EventArgs类或其子类的对象。当事件发生
时,Method会收到这两个参数。一旦建立了
委托关系,系统自动在特定事件发生时,转而
执行您所委托的事件处理方法。
重载事件方法
• 在C#中,针对不同类所相关的事件,除了定义有
事件成员外,也定义了可重载的事件方法,可通
过重载这些事件方法来设计你所希望的对应事件
处理。
• 这些可重载的事件方法名称皆以“On”开头,且被
声明为“virtual”,一个被声明成virtual的方法,就
代表它可被重载,被声明成override的方法也代表
它可被重载,如果声明成abstract则必须被重载。
例如按钮的Click事件,就有一个对应的可重载的
OnClick事件方法。
{
// 在此处放置用户代码以初始化页面
btnTest2.Click += new System.EventHandler(btnTest2_Click);
}
ASP.NET服务端添加客户端事件
• 尽管从技术角度讲,Microsoft® ASP.NET
服务器控件的所有功能都可以在服务器端
执行,但通常情况下通过添加客户端脚本
可以大大增强服务器控件的可用性。例
如,ASP.NET 验证Web 控件可以在服务
器端执行所有的验证检查。但是,对于高
版本浏览器,验证Web 控件也会发送客户
端脚本,以在客户端进行验证。
ASP.NET 服务器控件可以发送两种客户端
脚本:
• 客户端脚本块:客户端脚本块通常是用
JavaScript 编写的,其中通常包含在发生特
定的客户端事件时执行的函数。
• 客户端HTML 属性:客户端HTML 属性提
供将客户端事件与客户端脚本联系在一起
的方法。
ASP.NET中发送客户端脚本块
使用System.Web.UI.Page 类包含的两个方
法可以将客户端脚本代码发送到由
ASP.NET Web 页面提供的HTML 中:
• RegisterStartupScript(key, script) :在
Web 窗体的结尾处(在</form> 标识之前)
发送脚本块。
• RegisterClientScriptBlock(key, script):在
Web 窗体的开始处(紧接着<form
runat=“server”> 标识之后)发送脚本块。
ASP.NET 中发送HTML 属性
• 这种方法通常只适用于从
System.Web.UI.WebControls.WebControl 类导
出的服务器控件,因为从这个类导出的控件会发
送某些HTML 元素。
• WebControl 类包含一个将HTML 元素属性添加
到由Web 控件发出的HTML 元素的方法。该方
法称为AddAttributesToRender(),它只有一个输
入参数,即HtmlTextWriter 的实例。
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace ASPNETEvent
{
/// <summary>
/// AddClientEvent 的摘要说明。
/// </summary>
public class AddClientEvent : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
private void Page_Load(object sender, System.EventArgs e)
{
string script = @"return confirm('真的要删除吗?');";
this.Button1.Attributes.Add("onclick",script);
if (!Page.IsStartupScriptRegistered("PopUp")&&!Page.IsPostBack)
{
string scriptBlock =
@"<script language=""JavaScript"">alert(""发送客户端脚本"");
</script>";
Page.RegisterStartupScript("PopUp", scriptBlock);
}
}
Web Form Designer generated code
}
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>04PostBack</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
<SCRIPT language="javascript">
function ConfirmUpdate(cmd)
{
if(confirm("真的要保存吗?"))
{
eval(cmd);//这里利用了Javascript eval函数来调用一个字符串中包含的命令。
}
else
{
alert("已经取消!");
}
}
</SCRIPT>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="_04PostBack" method="post" runat="server">
<FONT face="宋体">
<asp:DropDownList id="ddlTest" style="Z-INDEX: 101; LEFT: 180px; POSITION: absolute; TOP: 83px" runat="server">
<asp:ListItem Value="1">1</asp:ListItem>
<asp:ListItem Value="2">2</asp:ListItem>
<asp:ListItem Value="3">3</asp:ListItem>
</asp:DropDownList>
<asp:Button id="btnSave" style="Z-INDEX: 102; LEFT: 294px; POSITION: absolute; TOP: 84px" runat="server" Text="保存"></asp:Button></FONT>
</form>
</body>
</HTML>
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace ASPNETEvent
{
/// <summary>
/// _04PostBack 的摘要说明。
/// </summary>
public class _04PostBack : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DropDownList ddlTest;
protected System.Web.UI.WebControls.Button btnSave;
private void Page_Load(object sender, System.EventArgs e)
{
string strCMD = Page.GetPostBackClientHyperlink( btnSave, "" );
string script = @"Javascript:ConfirmUpdate(""EVAL_MESSAGE"");";
script = script.Replace( "EVAL_MESSAGE" , strCMD );
ddlTest.Attributes.Add("onchange",script);
}
Web Form Designer generated code
private void btnSave_Click(object sender, System.EventArgs e)
{
Response.Write("已经保存!");
}
}
}
控件定位
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace ASPNETEvent
{
/// <summary>
/// ServerFresh 的摘要说明。
/// </summary>
public class ServerFresh : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsClientScriptBlockRegistered("MyScript"))
this.RegisterClientScriptBlock("MyScript",ScriptHelper.GetViewControlScript("Button1"));
}
Web Form Designer generated code
private void Button1_Click(object sender, System.EventArgs e)
{
}
}
/// <summary>
/// 提供一些产生页面脚本的方法
/// </summary>
public class ScriptHelper
{
/// <summary>
/// 获取客户端查看控件的脚本
/// </summary>
/// <param name="controlName"></param>
/// <returns>脚本代码</returns>
public static string GetViewControlScript(string controlName)
{
//创建客户端函数ViewObj
string script = "\n";
script += "<script language=\"javascript\">\n";
script += "function ViewObj(objName)\n";
script += "{\n";
script += "var obj = document.all.item(objName);\n";
script += "if (obj != null)\n";
script += "{\n";
script += "\tobj.scrollIntoView();\n";
script += "\tobj.focus();\n";
script += "}\n";
script += "}\n";
//创建客户端函数ToDo
script += "function ToDo()";
script += "{\n";
script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName);
script += "}\n";
script += "window.onload = ToDo;\n";
script += "</script>\n";
return script;
}
}
}
回车默认
<HTML>
<HEAD>
<title>EnterKey</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
<SCRIPT LANGUAGE="javascript">
function SubmitKeyClick(button)
{
if (event.keyCode == 13) //回车键盘
{
event.returnValue = false;
document.all[button].click();
}
}
// -->
</SCRIPT>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="EnterKey" method="post" runat="server">
<asp:TextBox id="tbInput" runat="server" Width="240px"></asp:TextBox>
<asp:Button id="btnOK" runat="server" BorderWidth="1px" BorderColor="Purple" BorderStyle="Solid" Text="浏览站点"></asp:Button>
</form>
</body>
</HTML>
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace ASPNETEvent
{
/// <summary>
/// EnterKey 的摘要说明。
/// </summary>
public class EnterKey : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox tbInput;
protected System.Web.UI.WebControls.Button btnOK;
private void Page_Load(object sender, System.EventArgs e)
{
tbInput.Attributes.Add("onkeydown","SubmitKeyClick('btnOK');");
}
Web Form Designer generated code
private void btnOK_Click(object sender, System.EventArgs e)
{
Response.Write("ok!");
}
}
}
Q:在ASP.NET程序开始的时候,如何直接弹出一个网页对话框,同时看不见父页面。也就是说只看到一个登录窗口(网页对话框形式的)。
A:需要用javascript实现。要用window.showModalDialog()。在Page_Load中添加以下代码:
If (!IsClientScriptBlockRegistered("clientScript"))
{
string strScript = "<script>" ;
strScript += "function OpenWin(){";
strScript += "var str=window.showModalDialog('WebForm2.aspx',document.Form1.TextBox1.value)";
strScript += "if(str!=null) document.Form1.TextBox1.value=str";
strScript += "}";
strScript += "</script>";
RegisterClientScriptBlock("clientScript", strScript);
}
Button1.Attributes.Add("onclick", "OpenWin()");