用户控件及事件添加

在90年代初,Microsoft为Web程序员提供的 Active Server Pages(ASP)革命性地改变了Web的编程。它可以利用十分易用的模型在Web服务器上动态生成HTML,并且很容易的实现了对数据库的访问,就当时来说,这是一项多么吸引人的技术,包括现在Internet上的许多web站点都是用Asp写的,我的同事前辈们更是玩Asp的高手,经历这么多年而不衰,可见他的成功。 
         但是,技术是在不断的发展着,引用某位Net专家的话讲――如今Web编程的状态还是落后的。因此Microsoft提出了第二代编程模型――Web窗体。Web窗体模型作为Asp.net的一部分,而Asp.net又是.Net框架的一个部分。他的编程模型是基于事件的,使用他更像是在进行Windows窗体编程,这一点也正是我决定去学习使用他的一个重要原因,也胡乱看了一些这方面的书,写这篇文章的目的也就是和各位Asp.net初学者和还没有为用户控件添加过自定义事件的同行分享一下经验。 
 废话少说,下面就让我们先建立一个用户控件吧,这里就用一个简单登录用户控件来做演示。 
 先来看看用户控件的前台代码(LogInOutControl.ascx文件): 
<%@ Control Language="c#" AutoEventWireup="false" Codebehind="LogInOutControl.ascx.cs" Inherits="ZZ.LogInOutControl" TargetSchema=" http://schemas.microsoft.com/intellisense/ie5"%> 
<TABLE id="Table1" style="FONT-SIZE: 9pt; WIDTH: 183px; HEIGHT: 125px" cellSpacing="1" 
 cellPadding="1" width="183" align="center" border="1"> 
 <TR> 
  <TD height="20"> 
   <asp:Label id="LabelUser" runat="server">用户:</asp:Label> 
   <asp:TextBox id="TextBoxUserName" Width="128px" runat="server"></asp:TextBox></TD> 
 </TR> 
 <TR> 
  <TD height="20"><FONT face="宋体"> 
    <asp:Label id="LabelPassword" runat="server">密码:</asp:Label> 
    <asp:TextBox id="TextBoxPassword" Width="128px" runat="server" TextMode="Password"></asp:TextBox></FONT></TD> 
 </TR> 
 <TR> 
  <TD align="center" height="20"><FONT face="宋体"> 
    <asp:Button id="ButtonLogIn" Width="50px" Text="登录" runat="server"></asp:Button> 
    <asp:Button id="ButtonLogOut" Width="49px" Text="注销" runat="server"></asp:Button></FONT></TD> 
 </TR> 
</TABLE> 
我们简单简单的放了两个Label,两个TextBox,两个Button以及一个Html表。 
接下去就是为LogInOutControl.ascx.cs文件添加代码了。 
首先定义一个delegate,其中LogInOutEventArgs类是从EventArgs类继承, 
public delegate void LogInOutClickHandler(object sender,LogInOutEventArgs e); 
我觉得把这个delegate放在LogInOutControl类外面更为合适。 
接下去为控件声明了LogInOutClick事件,如下: 
public event LogInOutClickHandler LogInOutClick; 
另外为了更好的使用属性,加了Language枚举, 
private Language language; 
当然外部通过public Language Lg {get;set;}属性来访问。目的就是改变或者获取当前控件的显示。 
接下去就是定义控件事件触发函数OnLogInOutClick,由按钮单击事件处理函数来完成对用户控件事件的触发。 
完整代码如下: 
namespace ZZ 

 using System; 
 using System.Data; 
 using System.Drawing; 
 using System.Web; 
 using System.Web.UI.WebControls; 
 using System.Web.UI.HtmlControls;  

 // 定义代理 
 public delegate void LogInOutClickHandler(object sender,LogInOutEventArgs e); 
 public class LogInOutControl : System.Web.UI.UserControl 
 { 
  protected System.Web.UI.WebControls.Button ButtonLogIn; 
  protected System.Web.UI.WebControls.TextBox TextBoxUserName; 
  protected System.Web.UI.WebControls.TextBox TextBoxPassword; 
  protected System.Web.UI.WebControls.Button ButtonLogOut; 
  protected System.Web.UI.WebControls.Label LabelUser; 
  protected System.Web.UI.WebControls.Label LabelPassword; 
  public event LogInOutClickHandler LogInOutClick; 
  private Language language; 
  //方法 
  public void ChangeLanguage(Language language) 
  { 
   this.Lg = language; 
  } 
  //属性 
  public Language Lg 
  { 
   set 
   { 
    if(value!=this.language) 
    { 
     if(value==Language.English) 
     { 
      this.LabelUser.Text = "User:"; 
      this.LabelPassword.Text ="Password:"; 
      this.ButtonLogIn.Text = "LogIn"; 
      this.ButtonLogOut.Text = "LogOut"; 
     } 
     else 
     { 
      this.LabelUser.Text = "用户:"; 
      this.LabelPassword.Text ="密码:"; 
      this.ButtonLogIn.Text = "登录"; 
      this.ButtonLogOut.Text = "注销"; 
     } 
    } 
   } 
  } 
  private void Page_Load(object sender, System.EventArgs e) 
  { 
   if(this.LabelUser.Text=="User:") 
     this.language = Language.English; 
    else 
     this.language = Language.Chinese; 
  } 
  private void OnLogInOutClick(object sender,LogInOutEventArgs e) 
  { 
   if(LogInOutClick!=null) 
    LogInOutClick(this,e); 
  } 
  #region Web 窗体设计器生成的代码 
  override protected void OnInit(EventArgs e) 
  { 
   InitializeComponent(); 
   base.OnInit(e); 
  } 
private void InitializeComponent() 
  { 
   this.ButtonLogIn.Click += new System.EventHandler(this.ButtonLogIn_Click); 
   this.ButtonLogOut.Click += new System.EventHandler(this.ButtonLogOut_Click); 
   this.Load += new System.EventHandler(this.Page_Load); 
  } 
  #endregion 
  private void ButtonLogIn_Click(object sender, System.EventArgs e) 
  { 
   OnLogInOutClick(this,new LogInOutEventArgs(LogInClickType.LongIn,CustomValidate(this.TextBoxUserName.Text,this.TextBoxPassword.Text))); 
  } 
  private void ButtonLogOut_Click(object sender, System.EventArgs e) 
  { 
   //注销代码省略 
   OnLogInOutClick(this,new LogInOutEventArgs(LogInClickType.LongOut,true)); 
  } 
  //验证函数 
  private bool CustomValidate(string userName,string password) 
  { 
   //验证代码省略,假设通过 
   return true; 
  } 
 } 

另外一个文件定义了枚举和参数类: 
using System; 
namespace ZZ 

 public class LogInOutEventArgs : EventArgs 
 { 
  private LogInClickType type; 
  private bool result; 
   
  public LogInOutEventArgs(LogInClickType type,bool result):base() 
  { 
   this.type = type; 
   this.result = result; 
  } 
  public LogInClickType Type 
  { 
   get{return this.type;} 
  } 
  //操作结果, 
  public bool Result 
  { 
   get{return this.result;} 
  } 
 } 
 //操作类型 
 public enum LogInClickType : int 
 { 
  LongIn, 
  LongOut 
 } 
 //定义语言 
 public enum Language  
 { 
  Chinese, 
  English 
 } 

接下去看看在aspx页面里面使用。 
新建一个Default.aspx页面,拖一个LogInOutControl用户控件到上面。 
<%@ Register TagPrefix="uc1" TagName="LogInOutControl" Src="LogInOutControl.ascx" %> 
<%@ Page language="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits="ZZ.Default" %> 
<%@ Import Namespace="ZZ" %> 
<HTML> 
 <HEAD> 
  <title>WebForm1</title> 
 </HEAD> 
 <body> 
  <form id="Form1" method="post" runat="server"> 
   <FONT face="宋体"> 
    <uc1:LogInOutControl id="LogInOutControl1" runat="server"> 
    </uc1:LogInOutControl> 
    <asp:Label id="LabelMsg" runat="server"></asp:Label> 
    <asp:DropDownList id="DropDownList1" runat="server" AutoPostBack="True"> 
     <asp:ListItem Value="0" Selected="True">中文</asp:ListItem> 
     <asp:ListItem Value="1">英文</asp:ListItem> 
    </asp:DropDownList></FONT> 
  </form> 
 </body> 
</HTML> 
在后台代码中添加事件和属性。 
虽然在前台添加了LogInOutControl1,但是后台代码中不会生成protected LogInOutControl LogInOutControl1;这条语句,我觉得很奇怪,不管先加上他。 
接着在Page_Load事件中注册LogInOutClick事件: 
this.LogInOutControl1.LogInOutClick += new LogInOutClickHandler(LogInOutControl1_LogInOutClick); 

完整代码如下: 
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 ZZ 

 public class Default : System.Web.UI.Page 
 { 
  protected System.Web.UI.WebControls.Label LabelMsg; 
  protected System.Web.UI.WebControls.DropDownList DropDownList1; 
  protected LogInOutControl LogInOutControl1; 
  private void Page_Load(object sender, System.EventArgs e) 
  { 
   //注册用户控件事件 
   this.LogInOutControl1.LogInOutClick += new LogInOutClickHandler(LogInOutControl1_LogInOutClick); 
  } 
  #region Web 窗体设计器生成的代码 
  override protected void OnInit(EventArgs e) 
  { 
   InitializeComponent(); 
   base.OnInit(e); 
  } 
  private void InitializeComponent() 
  {     
   this.DropDownList1.SelectedIndexChanged += new System.EventHandler(this.DropDownList1_SelectedIndexChanged); 
   this.Load += new System.EventHandler(this.Page_Load); 
  } 
  #endregion 
  private void LogInOutControl1_LogInOutClick(object sender, LogInOutEventArgs e) 
  { 
   switch(e.Type) 
   { 
    case LogInClickType.LongIn: 
     this.LabelMsg.Text = "你点击了登录按钮,操作结果:"+e.Result.ToString(); 
     break; 
    case LogInClickType.LongOut: 
     this.LabelMsg.Text = "你点击了注销按钮,操作结果:"+e.Result.ToString(); 
     break; 
   } 
  } 
private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e) 
  { 
   this.LogInOutControl1.Lg = (Language)this.DropDownList1.SelectedIndex; 
   //this.LogInOutControl1.ChangeLanguage((Language)this.DropDownList1.SelectedIndex); 
  } 
 } 

当用户在前台通过选择下拉框列表来改变控件的语言,这里通过Lg属性来完成,不过这里也加了一个方法ChangeLanguage也可以实现同样的功能。另外,通过点击登陆或注销按钮触发LogInOutClick事件来给页面中的LabelMsg.Text属性赋值从而得到操作结果。 
       总结,用户控件为程序员带来了很高的开发效率和重用性,更是在性能方面有了很大的提高,以前称为Asp+,其实我认为Asp.net跟Asp没有什么直接联系。而且我想做应用程序的朋友和我一样在开发Web程序时更喜欢采用代码分离方式,这样结构更清晰,便与修改和管理。同Asp程序相比,他是编译型的,引入了面向对象的设计思想,也就不可避免的带来了他的复杂性,要想开发高水准的Asp.net程序,对于模式的设计,层次结构的划分,这里还是比较讲究的。总之,他更像是在编Windows窗体程序,而不是在写VB脚本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值