当前位置: 首页 > 编程日记 > 正文

Asp.net控件开发学习笔记(三)-控件开发基础

封装

     asp.net中,控件被分为两类.用户控件和自定义服务器控件。前者就是我们经常用来将一些可复用的内容封装成的.ascx文件。这里主要研究后者.

创建自定义服务器控件

     创建自定义控件的第一步是选择以哪一个类作为基类来创建控件,Asp.net最常见的几个基类罗列如下:

System.Web.UI.Control:这是所有控件的基类,所有作为控件的类都必须直接或者间接的继承此类,此类仅仅提供最少量的属性和方法。

System.Web.UI.WebControls.WebControl:这个类继承于Control类,在实现控件最基本的属性和方法后,又额外提供了控件CSS样式相关的一系列属性。如果是UI控件,那肯定就选它了.

System.Web.UI.WebControls.Webpart:这个不用说了,看名字就知道是提供了WebPart相关的功能.

System.Web.UI.WebControls.CompositeControl:如果需要创建复合控件(即那些控件内部还有其他控件,比如Calender,选择这个类作为基类.

System.Web.UI.WebControls.DatabindingControl:用于作为数据源相关控件的基类。

System.Web.UI.WebControls.CompositeDatabindingControl:这个基类可以看做上面两个基类的结合,提供了上面两个基类的功能,GridView就是继承自这个基类.

简单控件Or复合控件

     先来了解一下简单控件和复合控件的定义:

简单控件:那些直接生成(render)对应HTML的控件,比如BottonTextBox控件.

复合控件:如何生成HTML依赖于其子控件,比如Reperater,FormView.

下面的图示会让概念更加清晰:
 


   简单控件是那些比较简单的更加,往往是一个控件对应一个
HTML标签.但缺点显而易见,就是当面对大量HTML代码片段时,就会显得更加难以维护.

复合控件在面对大量HTML代码片段时就显得游刃有余了,在遵守了面向对象抽象和封装的原则上,复合控件的维护性和易用性都不错.

Demo:创建一个简单的服务器控件:

    这里我们创建一个简单的菜单自定义服务器控件。通过继承最基础的System.Web.UI.Control基类。然后覆盖Render方法来达到自定义输出的目的,代码如下:

namespace SimpleControl

{

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

    public class MenuCustomControl : Control

    {

        protected override void Render(HtmlTextWriter writer)

        {

            base.Render(writer);

            writer.WriteLine("<div>");

            RenderMenuItem(writer, "网易", "http://www.163.com");

            writer.Write(" | ");

            RenderMenuItem(writer, "新浪", "http://www.sina.com");

            writer.Write(" | ");

            RenderMenuItem(writer, "MSDN", "http://msdn.microsoft.com");

            writer.Write(" | ");

            RenderMenuItem(writer, "ASP.NET", "http://asp.net");

            writer.WriteLine("</div>");

        }

        private void RenderMenuItem(HtmlTextWriter writer, string title, string url)

        {

            writer.Write("<span><a href=""");

            writer.Write(url);

            writer.Write(""">");

            writer.Write(title);

            writer.WriteLine("</a><span>");

        }

    }

}

通过HtmlTextWriter类,我们可以在控件原有的基础上,加入我们自己想加入的内容,注意base.Render(writer);方法,通过调用父类的Render方法,我们可以再实现父类的基础上,加入我们额外的内容(很像设计模式里的装饰模式)

控件使用方法:

  Ok,控件完成了.使用方法很简单,只需要在页面头部添加如下代码引入控件即可:

<%@ Register TagPrefix="sc" Namespace="SimpleControl" %>

在使用时就像使用用户控件一样,在页面注册完成后,系统会自动搜索命名空间内的直接或间接继承于Control基类的控件,在前台使用时,会自动出现智能提示:

代码如下:

<sc:MenuCustomControl runat="server"></sc:MenuCustomControl>

页面执行,效果如下:


      Demo2:
继承现有控件

 

        在很多情况下,我们并不需要重新发明轮子,我们可以通过继承来利用现有控件的特性并额外添加我们需要的功能达到复用的目的.先看一下效果:


   通过继承
TextBox控件,并添加额外的Enable3d属性,使现有控件拥有额外的属性。前台代码摘录如下:

我是3D的:<sc:TextBox3d runat="server"></sc:TextBox3d><br />

    我不是:<sc:TextBox3d runat="server" Enable3D="false"></sc:TextBox3d>

后台代码如下:

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

    public class TextBox3d : TextBox// 继承自TextBox

    {

        public TextBox3d()

        {

        Enable3D = true;

        }

       

        public bool Enable3D

        {

            get

            {

            object enable3D = ViewState["Enable3D"];

            if (enable3D == null)

            return false;

            else

            return (bool)enable3D;

            }

            set

            {

                ViewState["Enable3D"] = value;

            }

        }

        protected override void Render(HtmlTextWriter output)

        {

        if (Enable3D)

        output.AddStyleAttribute("FILTER", "progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true'");

        base.Render(output);

        }

    }

标签(Attribute)

也许你已经对上面代码的[ToolboxData("<{0}:textbox3d runat=server></{0}:textbox3d>")]感到很迷惑,其实这是C#特有的一种类型。Attribute的本质是一种用于修改其他类的属性或方法的类,其实Attribute本身就是一种类,所有的Attribute都会直接或者间接的继承于System.Attribute,像接口的名称往往以大写的I开头一样,标签的结尾习惯上以Attribute结尾,这样可以增加可读性.简单的示例如下:

public class SampleAttribute : Attribute

    {

}

注意,所有的标签(Attribute)都必须被声明为public.

在使用时可以像这样:

public class SampleClass

    {

        [SampleAttribute]

        public virtual void SampleMethod()

        {

            //...

        }

}

   在应用的时候,你可以针对一个类,方法或者属性应用好几个Attribute.应用方法可以将这些都写入一个方括号中,就像这样:

[DefaultProperty("Text"), toolboxdata("<{0}:mylabel runat=server></{0}:mylabel>")]

也可以分别写在几个不同的方括号中,就像这样:

    [DefaultProperty("Text")]

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

Visual Studio控件开发常用的标签(Attribute)

在利用Visual Studio进行控件开发时,利用Attribute特性可以让空间更加智能,比如当你双击控件时,默认会进入控件的哪个事件的EventHandler,或者当你从ToolBox里拽过来你开发的控件,默认在前台会生成什么样的代码片段等.这些都可以利用Attribute做到.这些常用的属性都被定义在System.ComponentModel命名空间中,下面是这个命名空间里的常用的Attribute.

Attribute

描述

BindableAttribute

Indicates whether or not a property supports two-way

data binding

BrowsableAttribute

Indicates whether or not a property or event should be listed in a property browser

DefaultEvent

Specifies the name of the default event for a class

DescriptionAttribute

Allows the property browser to display a brief description of a property

ToolboxData

Specifies default values for control attributes and customizes the initial HTML content

EditorAttribute

Associates a UI type editor with a property

DefaultProperty

Specifies the name of the default property for a class

转载于:https://www.cnblogs.com/CareySon/archive/2009/10/02/1577402.html

相关文章:

Codeforces Round #447 (Div. 2) B. Ralph And His Magic Field 数学

题目链接 题意&#xff1a;给你三个数n,m,k;让你构造出一个nm的矩阵&#xff0c;矩阵元素只有两个值&#xff08;1&#xff0c;-1),且满足每行每列的乘积为k&#xff0c;问你多少个矩阵。 解法&#xff1a;首先&#xff0c;如果n&#xff0c;m奇偶不同&#xff0c;且k-1时&…

剑指offer三十六之两个链表的第一个公共结点

一、题目 输入两个链表&#xff0c;找出它们的第一个公共结点。 二、思路 如果存在共同节点的话&#xff0c;那么从该节点&#xff0c;两个链表之后的元素都是相同的。也就是说两个链表从尾部往前到某个点&#xff0c;节点都是一样的。我们可以用两个栈分别来装这两条链表。一个…

Oracle数据库相关命令

从cmd窗口进入SQL命令行 sqlplus / as sysdba; 查询所有用户 &#xff08;1&#xff09;使用具有DBA权限的账号登录数据库。 &#xff08;2&#xff09;执行如下命令。 SQL> select username from dba_users; -- 或者使用如下语句 SQL> select * from all_users; 创…

实时传输协议(RTP)

RTP简介 RTP是一种提供端对端传输服务的实时传输协议&#xff0c;用来支持在单目标广播和多目标广播网络服务中传输实时数据&#xff0c;而实时数据的传输则由RTCP协议来监视和控制。 RTP定义在RFC 使用RTP协议的应用程序运行在RTP之上&#xff0c;而执行RTP的程序运行在UDP…

Windows LTSC、LTSB、Server 安装 Windows Store 应用商店

下载安装包 打开网址 https://store.rg-adguard.net/ 以 PackageFamilyName 方式搜索 Microsoft.WindowsStore_8wekyb3d8bbwe 根据系统选择对应的包&#xff0c;每一种都要下载 安装 在下载目录按住 shift 键&#xff0c;然后鼠标右键&#xff0c;打开 Powershell 执行安装命令…

sybase Invalid command line argument 'and'.

解决方法&#xff1a; 先到sybase central安装目录下&#xff08;我这里是&#xff1a;C:\sybase\ASE-12_0\bin\syconfig.exe&#xff09;双击看能不能正常运行。如果可以&#xff0c;就证明是开始菜单里的“配置服务器”的快捷方式有问题&#xff1b; 然后删除开始菜单里面“配…

Jmeter调试工具---Debug Sampler

使用场景&#xff1a;脚本开发是&#xff0c;调试用&#xff08;正式测试时需删除&#xff09;&#xff0c;Debug Sampler会把我们自定义的变量输出在response data中 使用设置&#xff1a;JMeter properties和System properties通常都选false&#xff0c;这两个就是JMeter和系…

Cannot resolve method 'getParameter( )'

在JSP页面中&#xff0c;getParameter 和 setAttribute 显示红色&#xff0c;IDEA的提示信息为&#xff1a; Cannot resolve method getParameter(...) 和 Cannot resolve method setAttribute(...) 原因是缺少servlet-api.jar和jsp-api.jar这两个jar包。 将这两个jar包导入项…

产品设计体会(1011)少做就是多做

有100个需求&#xff0c;资源只够做10个&#xff0c;是的&#xff0c;当时就是这样。标题是马云的一句话。2007年国庆长假回来&#xff0c;基本在全力做网店版“批量定时上架”的需求&#xff0c;n多的pk、评审、确认会搞得头昏脑胀&#xff0c;不过终于算是把需求确认掉了。其…

socket与TcpListener/TcpClient/UdpClient 的区别及联系

点击此处下载源代码 应用程序可以通过 TCPClient、TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP) 服务。这些协议类建立在 System.Net.Sockets.Socket 类的基础之上&#xff0c;负责数据传送的细节。(也就是说TCPClient、TCPListener 和 UDP…

Sql Server 中锁的概念

锁的类型:(1) 共享锁:共享锁用于所有的只读数据操作.(2) 修改锁:修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源&#xff0c;这样可以避免使用共享锁造成的死锁现象(3) 独占锁:独占锁是为修改数据而保留的。它所锁定的资源&#xff0c;其他事务不能读取也不能修改。独…

Java的Clone

Clone 就是重写clone()方法 两种办法进行深拷贝&#xff0c;一种是Clonable接口&#xff0c;一种是Serializable接口 实现代码如下 package Clone;public class Student implements Cloneable {private String name;public String getName() {return name; }public void setNam…

MySQL登录时ERROR 1045:Access denied for user ‘root’@’localhost’ (using password: YES)

MySQL登录时ERROR 1045错误win10_x64系统中登录MySQL时出现1045错误 错误描述&#xff1a; ERROR 1045&#xff1a;Access denied for user ‘root’’localhost’ (using password: YES) 解决方法&#xff1a; 1、停止MySQL服务 方法&#xff1a;在DOS窗口使用net stop mysql…

对L2和B2的阐述

根据英特尔官方称&#xff0c;之所以把B2步进E6300改产成L2步进的原生2M的E6300&#xff0c;原因在于B2在生产上和高端6800属一类型的内制芯片&#xff0c;在针脚面都拥有7颗主晶体&#xff0c;是很容易让E6300超到很高&#xff0c;E6300面临着以后的中端市场不得不将其价格低下…

江西省移动物联网发展战略新闻发布会举行-2017年10月江西IDC排行榜与发展报告...

编者按&#xff1a;当人们在做技术创新时&#xff0c;我们在做“外包产业“&#xff1b;当人们在做制造产业&#xff0c;我们在做”服务产业“&#xff1b;江人们在做AI智能时&#xff0c;我们在做”物联网“崛起&#xff0c;即使有一个落差&#xff0c;但红色热土从不缺少成长…

获取Linux/Unix文件系统信息

设计一套SAP监控系统http://blog.csdn.net/bayaci/archive/2009/10/13/4666456.aspx显示系统df&#xff08;linux &#xff09;/ bdf (hpunix)的信息执行代码&#xff0c;获取诸如bdf /usr命令后的信息&#xff1a;DiskInfo diskInfo new DiskInfo();diskInfo.info(directory)…

MySQL数据库相关命令

MySQL数据库 1、MySQL导出命令 mysqldump -h IP -u 用户名 -p 数据库名 > 导出的文件名 注&#xff1a;mysqldump命令是在cmd窗口初始目录下的命令&#xff0c;不是进入mysql执行的命令。 或者使用如下命令 mysqldump -u 用户名 -p 数据库名称 > 导出的文件名 2、MyS…

docker(3)docker下的centos7下安装jdk

1、将jdk-8u65-linux-x64.tar.gz文件传到docker的宿主机上 rz 2、将宿主机上的jdk-8u65-linux-x64.tar.gz复制到centos7的容器下 #在宿主机上执行 [rootcent7-zuoys ~]# docker cp /root/jdk-8u65-linux-x64.tar.gz a3b489cec243:/software#a3b489cec243是指定的centos7容器id …

请问,关闭子窗口提示错误,大家遇到这样的问题吗?

请问,关闭子窗口提示错误,大家遇到这样的问题吗? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiBase/html/delphi_20061207133720244.html关闭子窗口时总是提示下面的错误: Access violation at address 00000008. Read of address 00000008 …

Hadoop学习笔记一 简要介绍

Hadoop学习笔记一 简要介绍 这里先大致介绍一下Hadoop. 本文大部分内容都是从官网Hadoop上来的。其中有一篇介绍HDFS的pdf文档&#xff0c;里面对Hadoop介绍的比较全面了。我的这一个系列的Hadoop学习笔记也是从这里一步一步进行下来的&#xff0c;同时又参考了网上的很多文…

Struts 2(八):文件上传

第一节 基于Struts 2完成文件上传 Struts 2框架中没有提供文件上传&#xff0c;而是通过Common-FileUpload框架或COS框架来实现的&#xff0c;Struts 2在原有上传框架的基础上进行了进一步封装&#xff0c;从而大大简化了文件上传的开发应用。 1.1 下载并安装Common-FileUpload…

LA3177 - Beijing Guards(二分+贪心【更优美的解法)

简介&#xff1a;同皇帝的烦恼 分析&#xff1a; 如果n是偶数&#xff0c;那么答案就是相邻两个人的r值之和的最大值 即ansmax{r(i)r(i1)} (i1,2,3,…,n)&#xff0c;规定r(n1)r1 这时的ans实际上是答案的下限 一个合法的方案就是&#xff0c;对于编号为i的人来说&#xff0c…

Redis数据库设置密码

Redis数据库的默认打开方式为无密码打开&#xff0c;现在要将其设置为以密码形式打开。 Redis文件夹内容1、修改配置文件 在redis.windows.conf文件中设置密码的命令中添加requirepass 123456一行&#xff0c;将Redis数据库的密码设置为123456 2、运行redis-server.exe程序 3…

沉甸甸的证书,沉甸甸的心情

今天收到了由电子工业出版社易飞思公司转寄的我在由51CTO、中国图书商报、互动出版网等单位联办的“2008年度最佳技术图书和原创作者评选”活动&#xff08;这是第二届了&#xff09;中所获得的“2008年度最佳原创作者”证书&#xff08;证书见下&#xff0c;非常精美&#xff…

windows :Tomcat免安装版环境变量配置 + jdk配置

1. 下载后解压&#xff0c;我解压的目录为&#xff1a;D:\Tomcat\apache-tomcat-9.0.1-windows-x64 2. 安装jdk和jre, 并配置环境变量&#xff1b; 2.1 用户变量新建JAVA_HOME&#xff1b; 2.2 系统变量CLASSPATH中添加&#xff1a;.;C:\Program Files\Java\jdk1.8.0_144\lib…

将数据库查询结果导出成Excel表格

使用Java代码&#xff0c;从数据库中获取结果集&#xff0c;将结果集导出成Excel表格形式。 从数据库中查询学生表所有数据&#xff0c;将其导出成Excel表格&#xff0c;点击查看学生表表结构 。 package com.test.test.test1;import com.test.test.db.StudentDb; import com.…

【Java_基础】Java中Native关键字的作用

本篇博文转载与&#xff1a;Java中Native关键字的作用转载于:https://www.cnblogs.com/leiblog/p/10529056.html

在SQL Server 2000 和SQL Server 2005中导出表结构

SQL Server 2000 SELECT 表名 case when a.colorder1 then d.name else end, 表说明 case when a.colorder1 then isnull(f.value,) else end, 字段名 a.name, 主键 case when exists(SELECT 1 FROM sysobjects where xtypePK and p…

百度、谷歌理念对对碰

尽管百度和谷歌哪个更好用是用户自己说了算,但它们对搜索引擎的理解和理念到底有多少异同?它们将带给用户一个怎样的搜索未来? 为了更好地看清这些问题,《第一财经日报》分别向两公司提出了如下问题,且听它们的回答.1.搜索结果提供得尽可能多,是否会提升搜索质量? 并不是搜索…

2019 GDUT Rating Contest I : Problem H. Mixing Milk

题面&#xff1a; H. Mixing Milk Input file: standard inputOutput file: standard outputTime limit: 1 secondMemory limit: 256 megabytesFarming is competitive business – particularly milk production. Farmer John figures that if he doesn’t innovate in his mi…