首页 第11章.用户控件和自定义控件

第11章.用户控件和自定义控件

举报
开通vip

第11章.用户控件和自定义控件第2章 认识C# 3 第11章 用户控件和自定义控件 在ASP.NET中,系统自带的服务器控件为应用程序开发提供了诸多便利。在应用程序开发中,许多功能都需要重复使用,而如果在应用程序开发中重复的编写类似的代码是非常没有必要的。ASP.NET让开发人员可以自行开发用户控件和自定义控件以提升代码的复用性,本章即将讲解用户控件和自定义控件的开发和使用。 11.1 用户控件 在ASP编程中,开发人员经常使用Include方式包含其他文件从而简化编程过程。而在ASP.NET中,控件能够提高应用程序中代码的复用性,不仅ASP...

第11章.用户控件和自定义控件
第2章 认识C# 3 第11章 用户控件和自定义控件 在ASP.NET中,系统自带的服务器控件为应用程序开发提供了诸多便利。在应用程序开发中,许多功能都需要重复使用,而如果在应用程序开发中重复的编写类似的代码是非常没有必要的。ASP.NET让开发人员可以自行开发用户控件和自定义控件以提升代码的复用性,本章即将讲解用户控件和自定义控件的开发和使用。 11.1 用户控件 在ASP编程中,开发人员经常使用Include方式包含其他文件从而简化编程过程。而在ASP.NET中,控件能够提高应用程序中代码的复用性,不仅ASP.NET提供了服务器控件,ASP.NET还支持用户自定义控件,从而提高了代码的复用性。 11.1.1 什么是用户控件 用户控件使开发人员能够根据应用程序的需求,方便的定义和编写控件。开发所使用的编程技术将与编写Web窗体的技术相同,只要开发人员对控件进行修改,就可以将使用该控件的页面的所有控件都进行更改。为了确保用户控件不会被修改、下载,被当成一个独立的Web窗体来运行,用户控件的后缀名为.ascx,当用户访问页面时,用户控件是不能被用户直接访问的。 注意:虽然.ascx文件会阻止用户的直接访问,但是一些常用的下载工具还是能够下载.ascx文件。 11.1.2 编写一个简单的控件 用户控件是以.ascx为后缀名的,在Visual Studio 2008中,可以通过【添加新项】选项创建一个用户控件,如图11-1所示。 图11-1 创建用户控件 用户控件创建完毕后,会生成一个.ascx页面。.ascx页面结构同.aspx页面基本没有什么区别。在解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 管理器中可以打开.aspx页面和.ascx页面进行对比,其结构并没有太大的变化,如图11-2和图11-3所示。 图11-2 创建一个用户控件 图11-3 用户控件的结构 用户控件中并没有“”等标记,因为.ascx页面作为控件被引用到其他页面,引用的页面(如.aspx页面)其中已经包含等标记。而如果控件中使用这样的标记,可能会造成页面布局混乱。用户控件创建完成后,.ascx页面代码如下所示。 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="mycontrol.ascx.cs" Inherits="_11_1.mycontrol" %> 其中没有任何的“”等标记,而.ascx.cs页面代码基本同.aspx相同,示例代码如下所示。 using System; //使用系统命名空间 using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; //使用Web命名空间 using System.Web.Security; using System.Web.UI; //使用UI命名控件 using System.Web.UI.HtmlControls; //使用Html控件命名空间 using System.Web.UI.WebControls; //使用Web控件命名空间 using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; //使用LINQ命名空间 namespace _11_1 { public partial class mycontrol : System.Web.UI.UserControl //从控件类派生 { protected void Page_Load(object sender, EventArgs e) //页面加载方法 { } } } 用户控件能够提高复用性,前面介绍的服务器控件,从很多情况下来说都可以看作是用户控件的一种。当网站需要登录框时,不可能在每个需要登录的地方都重新编写一个登录框,最好的方法是每个页面都能够引用一个登录框。当需要对登录框进行修改时,可以一次性的将所有的页面都修改完毕,而不需要对每个页面都修改登录框。 要达到这种目的,使用用户控件是最好不错的了。.ascx页面允许开发人员拖动服务器控件,并编写相应的样式来实现用户控件,同时用户控件也能够支持事件、方法、委托等高级编程。编写一个用户登录窗口,可以通过几个TextBox控件和Button控件来实现,示例代码如下所示。 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="mycontrol.ascx.cs" Inherits="_11_1.mycontrol" %>
用户登录

用户名 :

密码:

还没有注册?
上述代码创建了一个登录框界面。当用户进行网站访问时,网站希望用户能够注册和登录到网站从而提高网站的用户粘度、提升访问量。所以设置登录窗口是非常必要的,界面布局如图11-4所示。 图11-4 编写用户登录界面 当界面布局完毕后,就需要为用户控件编写事件。当用户单击【登录】按钮时,就需要进行事件操作。同Web窗体一样,双击按钮同样会自动生成事件,示例代码如下所示。 protected void Button1_Click(object sender, EventArgs e) { Label1.Text = "登录成功"; //显示登录信息 } 当单击【登录】按钮时,系统提示登录成功,当然这里只是一个简单的用户控件。如果要实现复杂的用户控件的登录窗口,还需要对用户登录进行验证、查询和判断等功能。当用户控件制作完毕后,就可以在其他页面引用用户控件,示例代码如下所示。 <%@ Register TagPrefix="Sample" TagName="Login" Src="~/mycontrol.ascx" %> //声明控件引用 在这段代码中,有几个属性是必须编写的,这些属性的功能如下所示: ​ TagPrefix:定义控件位置的命名控件。有了命名空间的制约,就可以在同一个页面中使用不同功能的同名控件。 ​ TagName:指向所用的控件的名字。 ​ Src:用户控件的文件路径,可以为相对路径或绝对路径,但不能使用物理路径。 了解了相关属性,就能够在其他页面中引用该控件了,示例代码如下所示。 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_11_1._Default" %> <%@ Register TagPrefix="Sample" TagName="Login" Src="~/mycontrol.ascx" %> 用户控件
上述代码声明了用户控件,并使用了用户控件,使用用户控件代码如下所示。 //使用用户控件 从上述代码可以看出,用户控件的格式为TagPrefix:TagName,当声明了用户控件后,就可以使用TagPrefix:TagName的方式使用用户控件。这样一个用户控件就使用完毕了,如图11-5所示。 图11-5 使用用户控件 运行Default.aspx页面,虽然在Default.aspx页面中没有使用制作和编写任何控件,以及代码,但是却已经运行了登录框,这说明用户控件已经被运行了,如图11-6所示。 图11-6 运行用户控件 当需要对登录框进行修改,而无需对页面进行修改时,只需要修改相应的用户控件即可。当多个页面进行同样的用户控件的使用时,若需要对多个页面的控件进行样式或逻辑的更改只需要修改相应的控件,而不需要进行繁冗的多个页面的修正。 11.1.3 将Web窗体转换成用户控件 在编写用户控件时,会发现Web窗体的结构和用户控件的结构基本相同。如果开发人员已经开发了Web窗体,并在今后的需求中决定能够在应用程序全局中能够访问此Web窗体,那么就可以将Web窗体改成用户控件。如果需要将Web窗体更改为用户控件,首先需要对比Web窗体和用户控件的区别: ​ Web窗体中有等标记,而用户控件没有。 ​ Web窗体和用户控件所声明的方法不同。 在了解以上区别后,就可以很容易的将Web窗体转换成用户控件。首先,只需要删除等标记即可。在删除标记后,好需要对两种窗体的声明方式进行更改,对于Web窗体,其标记方式如下代码所示。 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_11_1._Default" %> 而对于用户控件,声明代码如下所示。 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="mycontrol.ascx.cs" Inherits="_11_1.mycontrol" %> 在将Web窗体更改为用户控件时,只需要将Page Language更改为Control Language即可。这样就完成了Web窗体向用户控件的转换过程。 注意:有的时候,标记中还包括ClassName属性,当包含ClassName属性时,还需要修改相应的ClassName属性。 11.2 自定义控件 用户控件能够执行很多操作。并实现一些功能,但是在复杂的环境下,用户控件并不能够达到开发人员的要求,是因为用户控件大部分都是使用现有的控件进行组装,编写事件来达到目的。于是,ASP.NET允许开发人员编写自定义控件实现复杂的功能。 11.2.1 实现自定义控件 自定义控件与用户控件不同,自定义控件需要定义一个直接或间接从Control类派生的类,并重写Render方法。在.NET框架中,System.Web.UI.Control与System.Web.UI.WebControls.WebControl两个类是服务器控件的基类,并且定义了所有服务器控件共有的属性、方法和事件,其中最为重要的就是包括了控制控件执行生命周期的方法和事件,以及ID等共有属性。 实现自定义控件,必须创建一个自定义控件,自定义控件将会编译成DLL文件。创建自定义控件如图11-7所示。 图11-7 创建自定义控件 自定义控件创建完成后,会自动生成一个类,并在类中生成相应的方法,示例代码如下所示。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; //使用UI命名空间以便继承 namespace ServerControl1 { [DefaultProperty("Text")] //声明属性 [ToolboxData("<{0}:ServerControl1 runat=server>")] //设置控件格式 public class ServerControl1 : WebControl { [Bindable(true)] //设置是否支持绑定 [Category("Appearance")] //设置类别 [DefaultValue("")] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string Text //定义Text属性 { get //获取属性 { String s = (String)ViewState["Text"]; //获取属性的值 return ((s == null) ? "[" + this.ID + "]" : s); //返回默认的属性的值 } set //设置属性 { ViewState["Text"] = value; } } protected override void RenderContents(HtmlTextWriter output) //页面呈现 { output.Write(Text); } } } 开发人员可以在源代码中编写和添加属性。当需要呈现给HTML页面输出时,只需要重写Render方法即可,示例代码如下所示。 protected override void RenderContents(HtmlTextWriter output) { output.Write("定义的Text属性的值为:" + Text); //输出为页面呈现 } 在使用服务器控件时,会发现控件有很多的属性,例如SqlConnection属性、Color属性等,如图11-8所示。 图11-8 控件的属性 为了实现服务器控件的智能属性配置,开发人员能够在源代码中编写属性,示例代码如下所示。 public string GuoJingString //编写属性 { get { return (String)ViewState["GuoJingString"]; } //获取属性 set { ViewState["GuoJingString"] = value; } //设置属性 } 当自定义控件编写完毕后,需要在需要使用该控件的项目中添加引用。右击现有项目,选择【添加引用】选项,如果是同在一个解决方案下,则只要选择【项目】选项卡即可。而如果不在同一解决方案,则需要选择【浏览】选项卡浏览相应的DLL文件,如图11-9和图11-10所示。 图11-9 添加项目引用 图11-10 浏览DLL 单击【确定】按钮完成引用的添加后,就可以在页面中使用此自定义控件。若需要在页面中需要使用此自定义控件,同样同用户控件一样需要在头部声明自定义控件,示例代码如下所示。 <%@ Register TagPrefix="MyControl" Namespace="ServerControl1" Assembly="ServerControl1" %> 上述代码向页面注册了自定义控件,自定义注册完毕后,就能够在页面中使用该控件。同时,在工具栏中也会呈现自定义控件,如图11-11所示。自定义控件呈现在工具箱之后,就可以直接拖动自定义控件到页面,并且配置相应的属性,如图11-12所示。 图11-11 呈现自定义控件 图11-12 配置自定义属性 正如图11-12所示,开发人员能够在自定义控件中编写属性,这些属性可以是共有属性也可以是用户自定义的属性,用户可以拖动自定义控件使用于自己的应用程序中并通过属性进行自定义控件的配置。用户拖动自定义页面到控件后,页面会生成相应的自定义控件的HTML代码,示例代码如下所示。
上述代码就在页面中使用了自定义控件。在ASP.NET服务器控件中,很多的控件都是通过自定义控件来实现的,开发人员能够开发相应的自定义控件并在不同的应用中使用而无需重复开发。 11.2.2 复合自定义控件 单单一个简单的控件并不能实现太多的效果,在实际开发中,可能需要更多的功能,这种复杂功能控件最常见的就是SqlDataSource控件。SqlDataSource控件是数据源控件,通过SqlDataSource控件能够配置数据源,并且实现分页、插入、删除等功能。复合自定义控件就类似这样一个功能复杂的控件。编写复合自定义控件有以下几种方式: ​ 创建用户控件,并使用用户控件封装的用户界面实现复合控件。 ​ 开发一个编译控件,封装一个按钮控件和文本框控件,通过重写Render方法呈现。 ​ 从现有的控件中派生出新控件。 ​ 从基本控件类之一派生来创建自定义控件。 通过编写复合控件,能够让控件开发更加灵活,控件的使用人员也能够更加方便的配置控件,例如,重写登录控件,前台页面制作人员使用该控件时,可以为控件配置验证等功能,方便前台人员配置和使用。如图11-13所示。 图11-13 登录控件 为了实现登录控件,就必须在自定义控件中添加相应的服务器控件,在登录控件中,需要两个TextBox来让用户输入用户名和密码,填写完成后,必须单击登录按钮实现登录事件。在类中创建TextBox和Button代码如下所示。 public class ServerControl1 : WebControl { //创建服务器控件 public TextBox NameTextBox = new TextBox(); //创建TextBox控件 public TextBox PasswordTextBox = new TextBox(); //创建密码控件 public Button LoginButton = new Button(); //创建Button控件 … … } 上述代码创建了两个TextBox控件和一个Button控件。其中,NameTextBox让用户能够输入用户名,而PasswordTextBox能够让用户输入密码。当用户单击LoginButton时,就需要实现登录操作,在这里就需要声明一个事件,示例代码如下所示。 public event EventHandler LoginClick; //声明事件 完成对控件和事件的声明,就需要进行属性的编写。在登录控件中,希望在前台开发人员在开发过程中,能够轻易的配置属性进行使用,从而提高代码的复用性。在图11-13所表示控件中,开发人员希望控件的使用人员能够配置背景颜色、边框粗细、内置距离、登录说明和跳转连接等。在代码中,可以分别为这些属性进行配置,示例代码如下所示。 [Bindable(true)] //设置是否支持绑定 [Category("Appearance")] //设置类别 [DefaultValue("")] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string LoignBackGroundColor //设置背景属性 { get { return (String)ViewState["LoignBackGroundColor"]; } //获取背景 set { ViewState["LoignBackGroundColor"] = value; } //设置背景 } 上述代码定义了一个属性,在属性定义前,可以对属性进行描述,如代码中Bindable、Category等,这些常用的描述意义如下所示: ​ Bindable:是否用于绑定。 ​ Category:属性或事件显示在一个设置为“按分类顺序”的模式,如果不指定,则会显示在杂项中。 ​ DefaultValue:指定属性的默认值。 ​ Localizable:指定属性是否本地化。 编辑相应属性,在属性配置中就能够做相应的配置,如图11-14所示。 图11-14 自定义属性 在代码中,将Category属性设置为Appearance,这个属性就会在【外观】选项卡中出现。配置完成LoginBackGroundColor后,就可以为其他的属性做相应的配置,示例代码如下所示。 [Bindable(true)] //设置是否支持绑定 [Category("Appearance")] //设置类别 [DefaultValue("")] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string LoignBackGroundColor //设置背景颜色 { get { return (String)ViewState["LoignBackGroundColor"]; } //获取属性的值 set { ViewState["LoignBackGroundColor"] = value; } //设置属性默认值 } //登录边框粗细 [Bindable(true)] //设置是否支持绑定 [Category("Appearance")] //设置类别 [DefaultValue("")] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string LoginBorderWidth //设置边框粗细 { get { return (String)ViewState["LoginBorderWidth"]; } //获取边框属性的值 set { ViewState["LoginBorderWidth"] = value; } //设置边框默认值 } //登录的内置距离 [Bindable(true)] //设置是否支持绑定 [Category("Appearance")] //设置类别 [DefaultValue("")] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string LoginPadding //设置内置距离 { get { return (String)ViewState["LoginPadding"]; } //获取内置距离的值 set { ViewState["LoginPadding"] = value; } //设置默认值 } //登录说明 [Bindable(true)] //设置是否支持绑定 [Category("Appearance")] //设置类别 [DefaultValue("")] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string LoginInformation //设置登录信息 { get { return (String)ViewState["LoginInformation"]; } //获取登录信息的值 set { ViewState["LoginInformation"] = value; } //设置默认登录信息值 } //登录跳转URL [Bindable(true)] //设置是否支持绑定 [Category("Appearance")] //设置类别 [DefaultValue("")] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string ResignURL //设置登录跳转URL { get { return (String)ViewState["ResignURL"]; } //获取URL的值 set { ViewState["ResignURL"] = value; } //设置URL默认值 } 编写完成属性后,就可以通过重写Render方法呈现不同的HTML,示例代码如下所示。 protected override void RenderContents(HtmlTextWriter output) //编写页面输出 { output.RenderBeginTag(HtmlTextWriterTag.Div); //创建Div标签 output.RenderBeginTag(HtmlTextWriterTag.Tr); //创建Tr标签 NameTextBox.RenderControl(output); //添加控件 output.RenderBeginTag(HtmlTextWriterTag.Td); //创建Td标签 output.RenderBeginTag(HtmlTextWriterTag.Br); //创建Br标签 output.RenderBeginTag(HtmlTextWriterTag.Tr); //创建Tr标签 PasswordTextBox.RenderControl(output); //添加控件 output.RenderBeginTag(HtmlTextWriterTag.Td); //输出Td标签 } 上述代码使用了HtmlTextWriter类,HtmlTextWriter类能够动态的创建HTML标签。上述代码中使用了HtmlTextWriter类的对象的RenderBeginTag方法创建相应的HTML标记。重写Render方法以呈现不同的HTML后,用户就能够看到登录界面,当用户单击【登录】按钮后,应该执行登录事件,这里应该是个事件冒泡,编写按钮提交事件代码如下所示。 public void Submit_Click(object sender, EventArgs e) { EventArgs arg = new EventArgs(); //编写按钮事件方法 if (LoginClick != null) //判断事件冒泡是否为空 { LoginClick(LoginButton, arg); //触发事件 } } 编写按钮事件后,整个自定义控件就制作完毕了。相比之下,自定义控件的制作并不是那么难,反而自定义控件能够实现更多的效果,并呈现不同的样式,并且允许界面开发人员能够通过相应的配置呈现不同的样式。 11.3 用户控件和自定义控件的异同 对比用户控件和自定义控件,很多人或认为用户控件更加容易开发,而自定义控件的门槛较高,不方便应用程序的开发。其实不然,用户控件更适合创建内部的应用程序特定的控件,例如用户登录控件会在该项目中经常使用,所以创建用户控件能够极快的提高应用程序开发。而自定义控件通常应用到更适合创建通用的可再分发的控件,例如常用的开源HTML编辑器Fckeditor就可以说是一个优秀的自定义控件。 通常用户控件在一个项目中经常使用,而自定义控件用来在通用的程序中使用,当网站应用程序开发中,导航控件如果用用户控件实现,是非常方便的。但是通过自定义控件实现,可能并不能适合所有的应用场合,当需要适应其他场合时,可能需要重新开发和编译。具体的讲,用户控件和自定义控件可以从以下几个方面来说明它们的区别: 1.使用率 在选择使用用户控件和自定义控件时,可以首先考虑使用率。如果开发的应用程序只是需要小范围的使用,则可以考虑用户控件,而如果开发的自定义控件能够在大部分的应用程序中被应用,则可以考虑自定义控件。 2.创建技术 用户控件和自定义控件的创建技术是不相同的,并且用户控件和自定义控件创建的难度也不相同,用户控件是以.ascx形式声明并创建的,开发过程也比较简单,并且有设计器提供设计支持,而自定义控件是从System.Web.UI.Control派生而来的,开发过程稍微复杂,也没有设计器提供设计支持。 3.生成方式 用户控件和自定义控件生成的方式不同,用户控件是以.ascx的形式呈现,而自定义控件是以DLL的形式呈现,通过添加引用,自定义控件能够在【工具箱】中显式,能够像服务器控件一样拖动到页面,并且能够通过编程开发增加自定义属性。而用户控件无法在工具箱显示,也不能够像自定义控件那样增加自定义属性。 4.性能 虽然用户控件和自定义控件编写的过程不同,也遵循不同的创建模型,但是用户控件和自定义控件都是从System.Web.UI.Control直接或间接的派生的,在性能上没有很大的差别,主要是因为当用户控件在页面中第一次使用时,将作为普通的服务器控件被解析并编译进配件,第二次使用时,就和其他编译型控件一样。 11.4 用户控件示例 在用户控件一节中,介绍了如何创建和使用用户控件。创建用户控件能够为应用程序开发起到非常好的作用,并且提高代码的复用性,ASP.NET允许开发人员创建用户控件和自定义控件,并在Visual Studio 2008中为开发人员提供了原生的开发环境,本节将一步步的进行用户控件的开发。 11.4.1 ASP.NET登录控件 在应用程序开发过程中,登录是必不可少的,例如当用户初次访问该页面时,可以选择登录,也可以选择注册,但是需要有一个登录框作为指导,否则用户无法登录到该网站。当用户再次回访时,登录控件也能够让用户快速的进行登录访问。 作为登录控件,不仅需要对用户的身份进行判断,还需要对用户输入的字符串进行判断,例如,“’”号是SQL数据库中的关键字,如果非法用户利用了SQL关键字中的“’”号进行登录,则会出现错误,系统会提示异常,暴露数据库,这样是非常不安全的,所以登录控件还需要对输入的字符串进行判断,判断完成后,如果不是非法用户,则再继续对身份进行验证。 11.4.2 ASP.NET登录控件的开发 ASP.NET登录控件开发起来并不难,主要是需要理清几个基本概念: ​ 用户是否已经注册过,注册过就可以直接登录。 ​ 用户如果没注册过,则需要跳转到注册页面。 ​ 如果用户输入的是非法字符或是没有任何输入,则先不对身份进行验证,先对输入框进行验证。 ​ 用户的验证是通过用户名和密码一起验证的。 当理清了以上思路之后,就能够进行ASP.NET登录控件的开发了。首先,在现有项目中添加一个新项并在弹出窗口中选择【Web用户控件】项目,如图11-15所示。 图11-15 添加新项 创建一个用户控件,并命名为LoginForm.ascx,方便在今后的开发中进行识别。 注意:良好的页面命名习惯也是一种良好的开发习惯,当页面增多时,可以通过页面命名的含义快速的寻找到相应的页面,当用户控件增多时,良好的命名也可以帮助快速寻找到相应的控件。 当创建完成一个LoginForm的用户控件后,就需要对用户控件进行页面布局,布局步骤如下所示。 ​ 拖动两个TextBox,一个作为用户名输入框,一个作为密码输入框。 ​ 将密码输入框的TextMode属性设置为Password。 ​ 拖动一个Button按钮,当用户单击Button按钮时,进行登录操作。 ​ 拖动一个LinkButton按钮,当用户单击LinkButton按钮时,跳转到登录页面。 当大概理清了控件的布局后,就可以针对控件的功能进行布局,如图11-16所示。 图11-16 登录框控件初步布局 初步的对登录控件进行布局,发现这样的布局并不美观。对于访问者而言,看到一个并不美观的登录控件,很可能就没有想要登录或注册的想法。一个好的用户登录控件的布局,能够提升访问者的兴趣,于是就需要对控件进行布局更改,这里就需要借助于 表格 关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载 等布局工具,单击菜单栏中的【表】选项,单击下拉菜单中的【插入表】选项,系统会弹出默认的表格窗口。在这里,需要3行2列进行布局,可以在对话框中选择行数3、列数2进行配置,如图11-17和图11-18所示。 图11-17 表格默认值 图11-18 配置表格属性 技巧:配置表格属性后,可以勾选“设为新表格的默认值”,当下一次创建表格时,就无需再次配置,当大量的需要同样格式的表格时,可优先考虑此方案。 在编写好表格后,只需要拖动表格进行用户控件的布局即可,布局后HTML代码如下所示。
用户名 :
密码  :
还没有注册?
上述代码所呈现的样式如图11-19所示。 图11-19 更改样式后的登录控件 当登录控件的样式初步制作完毕后,就需要增加一些验证控件,并编写登录框的事件。增加验证控件和增加单击事件后的HTML代码如下所示。
用户名 :
密码  :
还没有注册?
HTML代码确定后,可以编写登录事件,示例代码如下所示。 protected void Button1_Click(object sender, EventArgs e) { if (TextBox1.Text != "test" && TextBox2.Text != "test") //如果用户名不匹配 { Label1.Text = "登录失败"; //提示登录失败 } else { Label1.Text = "登录成功"; //否则登录成功 } } 上述代码判断如果用户名如果不等于test并且密码不等于test的话,则提示登录失败,否则登录成功。 技巧:在这里可以使用ADO.NET对数据库中的用户表进行操作,通过SELECT语句查询相应的用户,如果查询出的值返回值大于0,则说明有这个用户,否则没有这个用户,判断“登录失败”。 11.4.3 ASP.NET登录控件的使用 编写完成ASP.NET登录控件后,就可以使用登录控件进行登录页面的制作,在使用登录控件前,必须通过使用Register关键字向页面注册该用户控件,示例代码如下所示。 <%@ Register TagPrefix="Sample" TagName="Login" Src="~/LoginForm.ascx" %> 上述代码向页面注册了该控件。当页面被执行时,会通过TagPrefix以及TagName判断ASP.NET标签,并解析成相应的ASP.NET控件以呈现给页面,然后页面呈现给用户。当需要使用该控件时,只需要在页面中编写引用代码,示例代码如下所示。 上述代码就在相应的位置显示了用户控件,如图11-20所示。 图11-20 使用用户控件 对使用用户控件的页面进行页面布局,不会影响到用户控件的布局,对用户控件的布局,同样不会影响到页面的布局。相反的是,使用用户控件的页面无需考虑事件,也无需在该页面编写任何C#代码,这让页面变得非常的简洁,而事件的操作可以交付给用户控件,示例代码如下所示。 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_11_4._Default" %> <%@ Register TagPrefix="Sample" TagName="Login" Src="~/LoginForm.ascx" %> 无标题页
从上述代码可以看出,使用用户控件,并没有任何冗余的代码,这让页面代码显得非常的整洁和整齐。虽然从表面看上去只有HTML代码,但是并没有影响页面中程序的实现。运行后如图11-21所示。 图11-21 使用用户控件 虽然在页面中并没有实现控件的布局和事件的处理,但是在页面依旧可以呈现相应的控件布局和事件处理。自定义控件的好处就在于能够将复杂的样式或事件存储在一个控件中,以便在不同的页面中进行使用。 11.5 自定义控件实例 虽然用户控件能够尽快的上手并运用在开发中,但是自定义控件的编写能够实现更多的效果。如分页效果在大部分的数据索引中,都需要使用分页。如果存在这么一个分页控件,只需要指定需要分页的表,那么可以自动分页,就能够更加方便应用程序开发了。 11.5.1 ASP.NET分页控件 ASP.NET能够编写自定义控件,并将自定义控件编译为DLL文件以保证在任何其他的项目中能够使用自定义控件。在ASP.NET Web应用程序开发中,对于数据的索引,通常情况下是不可能全部将数据索引到一个页面的,所以在显示数据时,就需要进行分页操作。 当用户打开一个页面时,如果将全部的数据一起显示在页面,不仅页面臃肿难看,并且用户很难找到自己需要的信息。对于页面数据的整理和索引,能够让用户更加方便的找到自己需要的信息。不仅如此,如果一次全部的将数据呈现到HTML页面,势必会造成HTML页面数据的冗长,在运行页面时,也会增加服务器的压力,让Web应用程序变得非常的缓慢。 1.属性设置 使用ASP.NET分页控件,能够让数据分开显示,让用户能够自行选择,并且能够自行选择页码,查看相应的数据,创建一个MyPager自定义控件,用来执行分页操作,如图11-22所示。 图11-22 创建MyPager控件 创建完成后,就需要确定一些基本的属性,这些属性能够方便控件的使用者进行相应的配置,能够尽快的使用控件并完成编程目的。对于分页控件,通常需要确定的属性如下所示: ​ PageSize:用户希望一个页面呈现多少数据。 ​ Server:数据库服务器的地址。 ​ Database:数据库服务器的数据库。 ​ Pwd:数据库服务器有效的密码。 ​ Uid:数据库服务器有效的用户名。 ​ Table:需要执行分页的表,如果不指定SqlCommand,则自动生成语句。 ​ SqlCommand:如果不指定表,则执行SqlCommand。 ​ IndexPage :一开始的索引页面。 ​ PageName:当前页面的名称,用于跳转。 2.数据属性配置 在基本确定了以上属性后,就可以编写相应代码,首先需要为数据库连接和数据库的SQL语句的功能实现编写相应的属性,示例代码如下所示。 [DefaultProperty("Text")] //默认属性 [ToolboxData("<{0}:MyPager runat=server>")] //控件呈现代码 public class MyPager : WebControl { [Bindable(true)] //设置是否支持绑定 [Category("Appearance")] //设置类别 [DefaultValue("")] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string Text //Text文本属性 { get //获取属性 { String s = (String)ViewState["Text"]; //获取文本属性 return ((s == null) ? "[" + this.ID + "]" : s); //设置文本属性默认值 } set //设置属性 { ViewState["Text"] = value; } } [Bindable(true)] //设置是否支持绑定 [Category("Data")] //设置类别Data [DefaultValue(10)] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public int PageSize //分页数属性 { get { try { Int32 s = (Int32)ViewState["PageSize"]; //获取分页值 return ((s.ToString() == null) ? 10 : s); //设置默认值 } catch //如果用户输入异常 { return 10; //返回分页数 } } set { ViewState["PageSize"] = value; //设置分页 } } 上述属性设置了分页属性,当开发人员使用该控件进行分页设置时,该控件会根据不同的分页属性进行分页设置并进行分页操作。在执行分页前,还需要进行数据库的连接,这就需要编写数据连接属性,示例代码如下所示。 [Bindable(true)] //设置是否支持绑定 [Category("Data")] //设置类别Data [DefaultValue(“”)] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string Server //服务器地址 { get { String s = (String)ViewState["Server"]; //设置服务器地址 return ((s == null) ? ("(local)") : s); //默认服务器地址 } set { ViewState["Server"] = value; //设置默认值 } } [Bindable(true)] //设置是否支持绑定 [Category("Data")] //设置类别Data [DefaultValue(“”)] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string DataBase //数据库属性 { get { String s = (String)ViewState["DataBase"]; //设置数据库属性 return ((s == null) ? ("none") : s); //设置默认值 } set { ViewState["DataBase"] = value; //设置默认值 } } [Bindable(true)] //设置是否支持绑定 [Category("Data")] //设置类别Data [DefaultValue(“”)] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string Uid //数据库用户名 { get { String s = (String)ViewState["Uid"]; //设置UID属性 return ((s == null) ? ("uid") : s); //设置默认值 } set { ViewState["Uid"] = value; //设置默认值 } } [Bindable(true)] //设置是否支持绑定 [Category("Data")] //设置类别Data [DefaultValue(“”)] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string Pwd //数据库密码 { get { String s = (String)ViewState["Pwd"]; //设置密码属性 return ((s == null) ? ("none") : s); //设置默认值 } set { ViewState["Pwd"] = value; //设置默认值 } } [Bindable(true)] //设置是否支持绑定 [Category("Data")] //设置类别Data [DefaultValue(“”)] //设置默认值 [Localizable(true)] //设置是否支持本地化操作 public string Table //分页的表 { get { S
本文档为【第11章.用户控件和自定义控件】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_518229
暂无简介~
格式:doc
大小:448KB
软件:Word
页数:26
分类:互联网
上传时间:2011-04-07
浏览量:7