事件概述
• 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事件方法。
    private void Page_Load(object sender, System.EventArgs e)
        
{
            
// 在此处放置用户代码以初始化页面
            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;
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
    }

}

<%@ Page language="c#" Codebehind="04PostBack.aspx.cs" AutoEventWireup="false" Inherits="ASPNETEvent._04PostBack" %>
<!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;
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; 
  }
 

    }
 

}

回车默认
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<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!");
        }

    }

}


QASP.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()");

posted on 2006-06-05 18:24  公木子  阅读(406)  评论(0编辑  收藏  举报