ASP.NET 2.0服务器控件开发之控件样式

asp.net|服务器|控件|控件开发

  随着.NET技术的不断发展和成熟,服务器控件越来越受到广大开发人员的喜爱。同时,服务器控件的发展也呈现出一些趋势,例如,功能越来越强大,很多功能逐渐从服务器端转移到客户端。另外,服务器控件也越来越美观。这可能与Windows操作系统越来越讲求功能与外观统一的发展思路有关。本文及其随后的几篇文章将重点介绍如何为服务器控件实现漂亮的外观。实际上,服务器控件的外观主要由样式属性决定。本文重点对实现控件样式的基本知识进行概括性讲解。

  服务器控件样式简介

  对于普通应用开发人员而言,只需要知道服务器控件具有哪些样式属性,并了解每一个样式属性可能为控件外观带来的影响即可。例如,如果需要修改页面背景颜色,则需要修改样式属性BackgroundColor值;如果需要设置表格对象外观,那么可能需要设置BorderColor、BorderWidth等样式属性。然而,对于一名控件开发人员而言,他们不仅需要掌握应用开发人员所掌握的相关知识,而且还必须了解构建控件样式属性的创建方法。

  通常,具有样式属性的服务器控件均继承自System.Web.UI.WebControl基类。这样,控件类可自动继承基类中的多个样式属性。这些样式属性包括获取或者设置控件背景颜色的BackColor、获取或者设置控件前景颜色的ForeColor、获取或者设置控件边框颜色的BorderColor、获取或者设置控件边框样式的BorderStyle等等。如果控件类从WebControl基类继承,那么这些样式属性可自动得到继承,并且允许开发人员根据具体情况,对这些样式属性进行重写。另外,如果控件类继承自其他现有控件类,例如 GridView,那么自定义控件将自动继承GridView基类的样式属性,如设置交替数据行样式的AlternatingRowStyle、设置正在编辑的数据行的样式EditRowStyle等等。很显然,这些继承自已有服务器控件的样式属性并非此处要讨论的重点。然而,读者应了解样式属性允许从基类继承并无需修改即可直接使用的。下面继续讨论WebControl类中的样式属性。

  WebControl类的样式均封装在ControlStyle属性中。该属性值是Style数据类型。为了更好的了解ControlStyle,下面列举了ControlStyle属性的定义代码。

private Style _controlStyle;
//定义ControlStyle属性
public Style ControlStyle{
 get {
  if(_controlStyle == null) {
   _controlStyle = CreateControlStyle();
   if(IsTrackingViewState) {
    ((IStateManager)_controlStyle).TrackViewState();
   }
  }
 }
}
//定义CreateControlStyle方法
protected virtual Style CreateControlStyle(){ return new Style(ViewState);}
  如上代码所示,ControlStyle是一个只读属性,其数据类型为Style。当第一次访问该属性的时候被创建,其过程为:首先,判断_controlStyle是否为空,如果为空,则调用CreateControlStyle方法来创建_controlStyle对象,即一个Style的实例。然后,执行视图状态跟踪任务,其具体过程由Style类所提供的TrackViewState方法来完成。

  在初步了解ControlStyle属性之后,接着我们应了解与该属性密切相关的Style类。

  Style类用于表示服务器控件的样式,其包括以下几个属性:

  (1)BackColor,获取或者设置Web服务器控件的背景色;

  (2)BorderColor,获取或者设置控件的边框颜色;

  (3)BorderStyle,获取或者设置控件的边框样式;

  (4)BorderWidth,获取或者设置控件的边框宽度;

  (5)CssClass,获取或者设置控件在客户端呈现的级联样式表类;

  (6)Font,获取与控件关联的字体属性;

  (7)ForeColor,获取或者设置控件的前景颜色;

  (8)Height,获取或者设置控件的高度;

  (9)IsEmpty,获取一个值,该值指示是否已经在ViewState中定义任何样式元素;

  (10)IsTrackingViewState,返回一个值,该值指示是否正在跟踪其视图状态的更改。

  (11)RegisteredCssClass,获取已向控件注册的级联样式表类;

  (11)ViewState,获取保存样式元素的视图状态。

  另外,Style类中还包括一些成员方法。利用它们可以很方便的对样式进行操作。下面列举了来自WebControl和Style类的,用于实现样式操作的方法。

  (1)protected virtural Style CreateControlStyle()

  创建由WebControl类在内部用来实现所有与样式有关的属性的样式对象。

  (2)public void ApplyStyle(Style s)

  将指定样式的所有非空白元素复制到服务器控件,改写控件的所有现有的样式元素。其中s表示要复制的样式。

  (3)public void MergeStyle(Style s)

  将指定样式的所有非空白元素复制到服务器控件,但不改写该控件现有的任何样式元素。其中s表示要复制的样式。

  以上三个方法均来自WebControl类。下面两个方法来自Style类。

  (4)public virtual void CopyFrom(Style s)

  将指定的Style的样式属性复制到从中调用此方法的Style类的实例中。s表示要复制的样式的Style。使用此方法Style类的当前实例中的所有属性都将替换为s参数指定的Style中的关联属性。

  (5)public virtual void MergeWith(Style s)

  将指定Style的样式属性与从中调用此方法的Style类的实例组合。其中s表示要合并的样式的Style。此方法通过将每个在Style类的当前实例中未设置的属性设置为s参数指定的Style的对应属性中的值,将两个Style对象的属性联接起来。只有尚未设置的属性将被替换。如果没有设置s参数中的属性,则它将不替换Style类的当前实例中的对应属性。

  为了帮助读者加深对于以上方法的理解,下面列举了一段示例代码。

//定义两个Style对象实例
Style s1 = new Style();
Style s2 = new Style();
//分别为s1和s2定义ForeColor属性值
s1.ForeColor = Color.Red;
s2.ForeColor = Color.White;
//调用相关方法
s1.CopyFrom(s2);
s1.MergeFrom(s2);
  上面的代码比较简单。Style对象实例s1在调用CopyFrom方法之后,其ForeColor的属性值将被修改为Color.White;s1在调用MergeFrom之后,其ForeColor的属性值则不变,仍然为Color.Red。

  重写样式属性

  样式属性的重载与其他属性的重载没有什么区别。然而,在实现过程中必须注意的是,对属性值所作的修改必须上传给控件的ControlStyle属性。下面列举了一个示例应用程序,其重写了Table控件的样式属性CellSpacing和Caption。服务器控件源代码如下所示。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebControlLibrary{
 [DefaultProperty("Text")]
 [ToolboxData("<{0}:WebCustomControl runat=server></{0}:WebCustomControl>")]
 public class WebCustomControl : Table {
  //创建构造函数
  public WebCustomControl() {
   base.Caption = "工作安排列表";
   base.CellSpacing = 0;
  }
  // 重写CellSpacing属性
  [ Bindable(false), Browsable(false), DefaultValue(0) ]
  public override int CellSpacing {
   get {
    return base.CellSpacing;
   }
   set {
    throw new NotSupportedException("不能设置CellSpacing属性.");
   }
  }
  //重写Caption属性
  [DefaultValue("工作安排列表")]
  public override string Caption {
   get { return base.Caption; }
   set { base.Caption = value; }
  }
 }
}
  以上代码主要用于说明重写样式属性的实现方法。具体分析如下所示。

  (1)控件类WebCustomControl继承自Table。这样,自定义控件则自动继承了Table控件所具有的所有样式属性。这为重写样式属性奠定了基础。

  (2)在控件类的构造函数中设置了Caption和CellSpacing的属性值。

  (3)重写CellSpacing属性。通过元数据属性标记设置了该属性不可被数据绑定(Bindable),告诉设计器该属性不可被浏览(Browsable),最后设置了默认值为0(DefaultValue)。另外,在CellSpacing属性的设置操作中定义了一个异常。当开发人员设置该属性时将显示该异常。

  (4)重写Caption属性,为该属性设置默认值。

  可能有些读者认为构造函数的设置内容没有什么意义。实际上,实现本例的核心就在于此。只有在构造函数中设置新的属性值,才能够将新值传递给ControStyle属性。因为ControlStyle属性主要完成的工作是负责样式状态管理以及样式属性的生成。如果没有把改变传到ControlStyle,那么重写的样式属性就不会按照预期的那样显示。

  下面列举了为测试自定义控件WebCustomControl而创建的Default.aspx页面源代码。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register TagPrefix="wcc" Namespace="WebControlLibrary" Assembly="WebControlLibrary" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>重写样式属性</title>
</head>
<body>
 <form id="form1" runat="server">
  <div>
  <wcc:WebCustomControl ID="demo1" runat="server" Font-Size="small" BorderWidth="1px" CellPadding="4" BorderColor="black" GridLines="both">
  <asp:TableRow>
   <asp:TableCell font-bold="True" runat="server">工作项目</asp:TableCell>
   <asp:TableCell font-bold="True" runat="server">截至日期</asp:TableCell>
   <asp:TableCell font-bold="True" runat="server">备注</asp:TableCell>
  </asp:TableRow>
  <asp:TableRow runat="server">
   <asp:TableCell runat="server">工作1</asp:TableCell>
   <asp:TableCell runat="server">7月17日</asp:TableCell>
   <asp:TableCell runat="server">备注内容</asp:TableCell>
  </asp:TableRow>
  <asp:TableRow runat="server">
   <asp:TableCell runat="server">工作2</asp:TableCell>
   <asp:TableCell runat="server">7月27日</asp:TableCell>
   <asp:TableCell runat="server">备注内容</asp:TableCell>
  </asp:TableRow>
  <asp:TableRow runat="server">
   <asp:TableCell runat="server">工作3</asp:TableCell>
   <asp:TableCell runat="server">7月29日</asp:TableCell>
   <asp:TableCell runat="server">备注内容</asp:TableCell>
  </asp:TableRow>
 </wcc:WebCustomControl>
</div>
</form>
</body>
</html>
  下面显示了示例应用效果图。

  根据Default.aspx源代码以及应用效果图可知,上图中的表格标题(Caption),以及相邻表格间距(CellSpacing)均由自定义控件内置设置,而不是通过控件的显式标记来完成。这就是重写控件样式属性的结果。

  小结

  本文首先对服务器控件样式的基本知识进行了简要介绍,然后,通过一个典型示例说明了重写控件样式属性的方法。希望读者通过这些内容,能够对服务器控件样式属性建立一个更为深入的理解。在随后的文章中,我们将讲解实现样式属性的具体方法。

时间: 2024-11-02 06:09:58

ASP.NET 2.0服务器控件开发之控件样式的相关文章

ASP.NET 2.0服务器控件之验证控件示例

asp.net|服务器|控件|示例 在上一篇文章中,我们讲解了有关实现验证控件的一些知识.那些内容将为开发人员实现验证控件奠定一定基础.为了帮助读者更好的理解验证控件的实现方法,本文将首先介绍常见验证控件的实现步骤,然后,通过一个典型示例说明验证控件的实现方法. 1. 验证控件实现步骤 在创建验证控件过程中,需要实现服务器端验证和客户端验证等核心内容.下面列举了验证控件的常见实现步骤. (1)验证控件类应由BaseValidator基类继承.这样可使验证控件自动继承参与验证框架所需要的功能.例如

详细阐述利用ASP.NET 2.0创建自定义Web控件开发说明

asp.net|web|创建|控件|控件开发 简介 从使用基本的文本编辑器到创作标记页面,Web 开发已经经历了一个漫长的过程.目前,集成开发环境 (IDE) 为开发过程中的几乎每个方面都提供了图形化表示形式.此外,还实现各种说明性编程技术以提高效率并降低出现错误的几率.Visual Studio 2005 和 ASP.NET 2.0 中的控件体系结构遵循了这些编程趋势,并且提供了可靠的.可扩展的环境,该环境设计为使开发人员可以创建能够以说明方式配置的控件. 此外,ASP.NET 中新的自适应呈

探讨ASP.NET 2.0中的Web控件改进技术

asp.net|web|控件 ASP.NET 2.0并没有抛弃1.1版本中的任何现有控件,而是增加了一组新的控件;同时还引入了若干新的控件开发技术.本系列文章将对这些内容展开全面探讨. 一. 引言 到目前为止,你可能已经了解了大量的ASP.NET 2.0新特征-母版页面,主题,提供者,等等--所有这样内容都相当精彩;但是,你是否了解到有关定制Web控件开发方面的重大变化?这正是我在本文中所想讨论的.如果你已经从事于控件开发,那么,我想本文所描述的ASP.NET 2.0中的新的改进特征会立即应用于

利用 ASP.NET 2.0 创建自定义 Web 控件

asp.net|web|创建|控件 Jayesh Patel.Bryan Acker.Robert McGovernInfusion Development适用于:Microsoft ASP.NET 2.0Microsoft Visual Studio 2005 摘要:ASP.NET 2.0 中新的自适应呈现模型为控件编写人员提供了很多新的选项.本文展示了这些选项如何使创建 ASP.NET 的自定义控件变得比以前更加容易. 本页内容 简介 自适应呈现模型 创建自定义服务器控件 TagKey 使用

利用ASP.NET 2.0创建自定义Web控件

asp.net|web|创建|控件 从使用基本的文本编辑器到创作标记页面,Web 开发已经经历了一个漫长的过程.目前,集成开发环境 (IDE) 为开发过程中的几乎每个方面都提供了图形化表示形式.此外,还实现各种说明性编程技术以提高效率并降低出现错误的几率.Visual Studio 2005 和 ASP.NET 2.0 中的控件体系结构遵循了这些编程趋势,并且提供了可靠的.可扩展的环境,该环境设计为使开发人员可以创建能够以说明方式配置的控件. 此外,ASP.NET 中新的自适应呈现模型减少了编写

对ASP.NET 2.0下面的新控件的困惑

asp.net|控件 大家知道在ASP.NET2.0下面微软件给出了一系统的新控件,有一些是挺有用的,比如那个Membership成员管理系统,以及分步向导控件都为我们节省了很多的时间,而另外一些,比如从Datagrid上升级来的Gridview有时候感觉倒不是那么好. 这个控件在为我们提供很大的方便的同时也失去灵活性,比如直接指定一个SQL语句就可以完成数据访问的工作,而分页显示,排序更是比吃饭还简单.众所周知,这是与我们分层的逻辑架构设计相违背的,这样就造成了一个难堪的局面,新手很难单单只凭

ASP.NET 2.0中使用multiview控件

asp.net|控件     在asp.net 2.0中,增加了许多新的控件和功能,大大方便了开发者的开发.这次要讲解的是在asp.net 2.0中新增的multiview控件的使用.所谓multiview控件,实际上是有点象在c/s开发中很常见的tabcontrol控件,可以在一个页面中,放置多个"view"(我们称为选项卡),比如可以用multiview控件,可以让用户在同一页面中,通过切换到每个选项卡,从而看到要看的内容,而不用每次都重新打开一个新的窗口.本文,将以visual

ASP.NET 2.0中的登陆控件简介(1)

asp.net|控件 asp.net 2.0中,新增了许多新的功能和控件.其中,新增的登陆控件可谓使得WEB应用的设计更加得心应手.什么是登陆控件呢?就是我们平常在WEB应用中经常要用到的用户注册,登陆,忘记密码,登陆后根据权限的不同而显示不同的页面等功能,现在在asp.net 2.0中都已经可以由提供的控件来实现了.ASP.NET 2.0中的登陆控件比较多,封装了大部分WEB应用中要实现系统登陆的系列功能,涉及到很多方面,本文将简单介绍一下它们的主要功能.       首先,asp.net 2

ASP.NET 2.0中的登陆控件简介

asp.net|控件 asp.net 2.0中,新增了许多新的功能和控件.其中,新增的登陆控件可谓使得WEB应用的设计更加得心应手.什么是登陆控件呢?就是我们平常在WEB应用中经常要用到的用户注册,登陆,忘记密码,登陆后根据权限的不同而显示不同的页面等功能,现在在asp.net 2.0中都已经可以由提供的控件来实现了.ASP.NET 2.0中的登陆控件比较多,封装了大部分WEB应用中要实现系统登陆的系列功能,涉及到很多方面,本文将简单介绍一下它们的主要功能. 首先,asp.net 2.0中,为了