自定义控件(HolyrongGridView)-扩展GridView控件(1):基础知识

来源:互联网 发布:echarts实例源码 编辑:程序博客网 时间:2024/06/05 19:01

1.自定义控件(HolyrongGridView)-扩展GridView控件(1):基础知识

2.自定义控件(HolyrongGridView)-扩展GridView控件(2):自定义分页

        一直想做一些可以在工具栏拖放的自定义控件,最近稍微有空,做了个自定义GridView控件。下面把创建自定义Web控件的一些基础知识和我做的过程中的一些体会记录下来。

        首先,在新建项目中选Windows项目,选择Web控件库,创建Web自定义控件库。(在这个项目中可以创建很多自定义的Web控件,以后在别的项目引用这个项目时会自动将这个项目库中的所有自定义控件显示在工具箱中),系统会默认在项目根目录下建一个继承自WebControl的Web自定义控件cs文件。将该cs的继承类修改为GridView,并创建一个构造函数,这样就是一个GridView控件了。如果再添加一个Web网站,我们会在工具箱中看到自己的自定义GridView了,但这还只是跟微软的GridView功能一模一样的GridView,我们还需要对他的功能进行扩展。这一步操作完后就可以真正开始扩展。主要代码:

  

     2.在HolyrongGridView类中添加一个属性,用来设置鼠标经过HolyrongGridView某行时的CSS样式。

     3.创建一个具体实现鼠标经过改变某行样式的类(命名为MouseOverStyleFunction),该类实现了第1步创建的抽象类ExtendFunctions。

     4.重写OnInit()事件,在HolyrongGridView类的OnInit()事件方法中添加这个类的实例。

       如果所扩展的功能不需要用到其他什么脚本的话,这样就可以了,但上述的扩展功能用到了一部分JavaScript脚本(MouseOverStyleFunction类中的hrc_ChangeMouseOverCssClass(this)是改变某个html对象CSS样式的JavaScript脚本),我把他写在一个js文件中,这样就需要对这个js脚本进行注册,否则在引用该控件的项目中找不到上面的js函数。

      在自定义控件HolyrongGridView中注册JavaScript脚本的方法:

      1)在HolyrongGridView的定义之前定义要嵌入的脚本(下面的HolyrongControls.HolyrongGridView.Resources.jsFunction.js是包含命名空间的资源名称):

  1. using System.Web.UI;
  2. [assembly: WebResource("HolyrongControls.HolyrongGridView.Resources.jsFunction.js""text/javascript")]
  3. namespace HolyrongControls
  4. {
  5.     public partial class HolyrongGridView : GridView

       2)注册脚本:

  1. /// <summary>
  2.         /// 在加载System.Web.UI.Control对象之后,呈现之前发生。
  3.         /// </summary>
  4.         /// <param name="sender"></param>
  5.         /// <param name="e"></param>
  6.         void HolyrongGridView_PreRender(object sender, EventArgs e)
  7.         {
  8.             if (!this.Page.ClientScript.IsClientScriptIncludeRegistered(this.GetType(), "hrc_javascript"))
  9.             {
  10.                 #region 注册JavaScript脚本
  11.                 this.Page.ClientScript.RegisterClientScriptInclude(
  12.                     this.GetType(),
  13.                     "hrc_javascript",
  14.                     this.Page.ClientScript.GetWebResourceUrl
  15.                         (
  16.                         #if DEBUG
  17.                         this.GetType(), "HolyrongControls.HolyrongGridView.Resources.jsFunction.js")
  18.                         #endif
  19.                         );
  20.                 #endregion
  21.                 #region 注册Css样式表
  22.                 System.Web.UI.HtmlControls.HtmlLink link = new System.Web.UI.HtmlControls.HtmlLink();
  23.                 link.Attributes["type"] = "text/css";
  24.                 link.Attributes["rel"] = "stylesheet";
  25.                 link.Attributes["href"] = Page.ClientScript.GetWebResourceUrl(this.GetType(), "HolyrongControls.HolyrongGridView.Resources.GridViewCss.css");
  26.                 this.Page.Header.Controls.Add(link);
  27.                 #endregion
  28.             }
  29.         }

     上述功能用到的JavaScript代码如下:

 

      到此,鼠标经过时改变GridView样式的功能扩展就完成了。

 

一些必须了解的知识点补充:

1.为自定义控件添加图标(工具箱中显示的图标):

  1.    [System.Drawing.ToolboxBitmap(typeof(HolyrongControls.Resources.Icon), "HolyrongGridView.bmp")]
  2.     public partial class HolyrongGridView : GridView

当然,跟注册JavaScript脚本一样,在添加该图标之前首先要在类定义前定义要嵌入的图标信息,同时还要特别注意两点:(1)图标为16*16的与自定义类同名的位图;(2)该位图属性应设置为:嵌入的资源。

2. 设置自定义控件的标记前缀([ToolboxData("<{0}:HolyrongGridView runat=server></{0}:HolyrongGridView>")])

  1. [ToolboxData("<{0}:HolyrongGridView runat=server></{0}:HolyrongGridView>"),
  2.    System.Drawing.ToolboxBitmap(typeof(HolyrongControls.Resources.Icon), "HolyrongGridView.bmp")]
  3.     public partial class HolyrongGridView : GridView

3.属性的设计时特性(选自郑健,网名:【夜战鹰】【ChengKing(ZhengJian)】的《庖丁解牛—纵向切入ASP.NET3.5控件和组件开发技术》

.NET Framework为控件设计时属性提供了很多丰富的类,这些属性的功能非常灵活,控制范围广泛,比如可以控制该属性在属性窗口中的显示模式,如:是否在属性窗口中显示该属性,也可以指定此属性必须接收值类型描述,按组分类等,也可以控制文本的标记呈现格式等,甚至可以自己定义一个属性类,实现自己想实现的功能。下面讲一下常用的.NET Framework的属性类对控件的支持功能。

Ø  Bindable

指定属性是否可以绑定一个有效数据源,通常使用布尔值进行设置。例如:Bindable(true)。如果使用值true标记属性,表示该属性可以绑定一个有效数据源

Ø  Browsable

指定属性是否应该在属性窗口中显示,使用布尔值设置。一般情况下,对于常用的和比较重要的属性设置Browsabletrue,否则设置Browsablefalse

Ø  EditorBrowsable

设置属性在编辑器中的可见性,比如设置在智能提示列表不显示或高级用户才可以看到该属性。

Ø  Category

指定属性在属性浏览器中进行分组显示的类别。该设计时特性帮助可视化编辑器将属性进行逻辑分组。通常分为:外观(Appearance)、行为(Behavior)、布局(Layout)、数据(Data)、操作(Action)、键盘(Key)和鼠标(Mouse)等。如果您安装的是中文版的IDE则默认情况下中文分类和英文分类是通用的即设置成“数据”或“Data”类别是等价的

Ø  Description

设置显示在属性窗口最下面的描述属性功能的文字说明。

Ø  DesignOnly

如果此属性设置为true,表示该属性只能在设计期间使用,不能在页面代码中设置其值。

Ø  ReadOnly

设置该属性是否为只读状态。如果此特性设置为true,则在属性窗口能看到属性,但不能设置其值。另外,通过在属性语句体中把 set 语句段去掉也可以起到相同的效果。

Ø  Themeable

设置该属性是否支持主题特性,默认情况下属性都支持主题。当该属性与界面无关时可以设置其值为false,禁用该属性的主题功能。

Ø  DesignerSerializationVisibility

指定属性是否以及如何在代码中序列化,其值为DesignerSerializationVisibility的枚举值,存在3种设置方式:

—  DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)指定序列化程序不应该序列化属性值;

—  DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)指定应该允许序列化程序序列化属性的值;

—  DesignerSerializationVisibility(DesignerSerializationVisibility.Content)指定序列化程序应该序列化属性的内容,而不是属性本身。此字段为只读。Visible为其默认值。

这里说的序列化是指在IDE中的设计器界面切换到代码视图时,看到的代码标记,或反向切换时把代码标记转化到设计器界面。后面讲复杂属性时会通过示例介绍此属性功能。

Ø  NotifyParentProperty

指示当此设计特性应用到的属性的值被修改时将通知其父属性。换言之,如果属性的父属性应该在该属性值被修改时接到通知,则向该属性应用NotifyParentProperty特性。通常使用布尔值进行设置。一般常用于复杂属性通知转换器更新到父级标记

Ø  ParseChildren

使用该设计特性指示当在页面上以声明方式使用控件时,嵌套在服务器控件标记内的XML元素是应该视为属性还是应视为子控件。通常情况下,包含两种声明方式:

—  ParseChildren(true)表示将子XML元素作为服务器控件的属性分析;

—  ParseChildren(bool childrenasProperty, string defaultProperty),其中childrenasProperty和上面的方式中的布尔值参数意义相同,defaultProperty定义默认情况下将子控件分析为服务器控件的集合属性。

Ø  PersistChildren

该设计特性指示设计时是否应将服务器控件的子控件作为内部嵌套控件保持。如果该特性为PersistChildren(true),则将服务器控件的子控件作为嵌套服务器控件标记保持。如果为PersistChildren(false),则将该控件的属性作为嵌套元素保持。

Ø  PersistenceMode

指定如何将服务器控件属性或事件保持到ASP.NET页面的元数据属性,共存在4种枚举设置方式:

—  PersistenceModePersistenceMode.Attribute)指定属性或事件保持为属性;

—  PersistenceModePersistenceMode.EncodedInnerDefaultProperty)指定属性作为服务器控件的唯一内部文本,如果属性值是HTML编码的,只能对字符串作这种指定;

—  PersistenceModePersistenceMode.InnerDefaultProperty)指定属性在服务器控件中保持为内部文本,还指示将该属性定义为元素的默认属性,只能指定一个属性为默认属性;

—  PersistenceModePersistenceMode.InnerProperty)指定属性在服务器控件中保持为嵌套标记,通常用于复杂对象,它们具有自己的持久性属性。

关于以上4种标记的具体用法下一节会详细介绍

Ø  DefaultValue

指定属性的默认值此特性的设置需要特别谨慎假如设置的值不为空则开发人员在使用时如果自己输入的值与默认值相同则控件不会装载开发人员输入的值也就是说此默认值不能指定为具有有效意义或业务意义的实际值一般设置为空即可。

Ø  DisplayName

指定在属性窗口中显示的别名。此别名仅在属性窗口中看到,当转换器转换到代码视图,以及在页面后面的代码中编码还是以实际的属性名称为准,而不是以该别名为准。

Ø  ParenthesizedPropertyName

指定属性在属性窗口中显示时是否带有括号相当于在Category分组特性基础上的对属性窗口属性集的排序功能如果不带括号该属性会自动排在该组的前面

Ø  PasswordPropertyText

指定是否设置成密码文本。如果设置为true,则在属性窗口中输入的文本会用特定的密码符号显示,而不是显示原文本;另外,在代码视图中看到的仍为原文本。

Ø  TypeConverter

指定用作此特性所绑定到的对象的转换器的类型。用于转换的类必须从TypeConverter继承。使用ConverterTypeName属性来获取为该特性所绑定到的对象提供数据转换的类名。后面会通过代码示例讲解如何自定义一个自己的类型转换器。

Ø  Editor

指定该属性的编辑器,如系统的文件编辑器、文本编辑器、颜色编辑器,还有集合编辑器等,也可以自己实现编辑器,具体用法后面会讲到。

Ø  ToolBoxItem

此属性为类特性。属于工具箱属性,可以设置当前控件是否在工具箱中显示,以及所在工具箱项的类型名称等信息。默认生成的控件都显示在工具箱中。

Ø  ToolBoxData

此特性为类特性,即不是属性的特性,而是类的特性,设置位置也是在类的上面。ToolBoxData表示从工具箱中拖一个控件到设计界面上时默认显示标记格式,如:

[ToolboxData("<{0}:ControlProperty runat=server></{0}:ControlProperty>")]

可以修改参数字符串,定制为自己想要的格式,但要保证所添加的属性为有意义的属性。

Ø  DefaultProperty

此特性为类特性。它指定服务器控件的默认属性,例如:[DefaultProperty("Text")]

指定用黑色粗体显示默认属性特性的属性名称。一般设置比较重要或常用的属性为默认的属性。如TextBox控件的Text属性。

Ø  DefaultEvent

此特性为类特性指定服务器控件的默认事件,例如:[DefaultEvent("OnClicked")]

指定用黑色粗体显示默认事件特性的事件名称。一般设置比较重要或常用的属性为默认的事件,如Button控件的OnClick事件。

Ø  ValidationProperty

此特性为类特性,指定该控件的哪个属性作为验证属性。当该控件与验证控件组合使用时,验证控件会自动验证该特性指定的属性。

Ø  AspNetHostingPermission

此属性为JIT编译时代码访问安全属性。需要使用此属性确保链接到控件的代码具有适当的安全权限。Control类带有两个JIT编译时代码访问安全属性标记:

AspNetHostingPermission(SecurityAction.Demand,Level=AspNetHostingPermissionLevel.Minimal)AspNetHostingPermission(SecurityAction.InheritanceDemand,Level=AspNetHosting PermissionLevel.Minimal).在使用时应把第一个属性应用于当前开发的控件,第二个属性是可选的,因为继承请求是可传递的,在派生类中仍有效。

Ø  ControlBuilder

分析时特性,将自定义控件生成器与控件关联。只有在您希望使用自定义控件生成器,对页分析器用分析控件的声明性语法的默认逻辑进行修改时,才需要应用此特性。如果仅希望指定控件标记中的内容是否与属性或子控件对应,请使用ParseChildrenAttribute,而不要使用自定义控件生成器。

Ø  Designer

设计时特性,指定与控件关联的设计器类。控件设计器类用于控制关联的控件在可视化设计器的设计图面上的外观和行为。

还有一些更复杂的,包括在设计模式下的元数据属性类在这里没有列出,因为在后面有专门的章节详细介绍,通过代码示例更容易理解。在这里只要理解上面这些属性类功能,开发一般的控件是没有问题了。

4.复合属性
定义一个实体类,复合属性就是这个实体类对象,在复合属性上增加元数据

  1. [
  2. DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
  3. PersistenceMode(PersistenceMode.InnerProperty)
  4. ]

5. 集合属性
定义一个继承自CollectionBase的类,集合属性就是这个类的对象,在集合属性上增加元数据

  1. [
  2. DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
  3. PersistenceMode(PersistenceMode.InnerProperty)
  4. ]

 

 

 

原创粉丝点击