组合控件与WebControl控件的事件和属性相差不大
组合控件,顾名思义就是把一些控件组合起来形成一个控件
这个控件将包含这些控件称为他的子控件

CompositeControl类实现了INameContainer接口
这样使得复合控件下的子控件都根据各自的层级关系生成唯一的客户端标识
不至于产生重复的ID

组合控件比较重要的方法是:
1.EnsureChildControls
此方法判断属性ChildControlsCreated是否为true
如果不是将执行下面的事件
2.CreateChildControls
此方法创建并生成组合控件下的所有子控件
此方法执行完后应该设置ChildControlsCreated属性为true
避免重复调用CreateChildControls

我写了一个生成组合控件的类
但是这个类里没有对子控件进行组织


using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.ComponentModel; namespace hellowControl
{
    public class HellowControl:CompositeControl
    {
        //继承的类可以重写protected变量
        protected TextBox _input;
        protected RegularExpressionValidator _regvalidator;
        protected RequiredFieldValidator _rqrvalidatator;
        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Div;
            }
        }
        //在此方法中创建子控件
        protected override void CreateChildControls()
        {
            //必须先清除控件
            //假设一个请求就是一个线程,那么这个线程创建了子控件
            Controls.Clear();
            _input = new TextBox();
            _input.ID = "mytxt";             _rqrvalidatator = new RequiredFieldValidator();
            _rqrvalidatator.ID = "myrequire";
            _rqrvalidatator.ErrorMessage = "内容为空";
            _rqrvalidatator.Display = ValidatorDisplay.Dynamic;
            _rqrvalidatator.ControlToValidate = _input.ID;             _regvalidator = new RegularExpressionValidator();
            _regvalidator.ID = "myExpression";
            _regvalidator.Display = ValidatorDisplay.Dynamic;
            _regvalidator.ErrorMessage = "格式错误";
            _regvalidator.ValidationExpression = @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
            _regvalidator.ControlToValidate = _input.ID;             this.Controls.Add(_input);
            this.Controls.Add(_rqrvalidatator);
            this.Controls.Add(_regvalidator);             //确认子控件已经创建,避免重复创建
            ChildControlsCreated = true;
        }
    }    
}
我重写了这个类
在我重写这个类的子类中,我对上面创建的子控件进行了组织


using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text; namespace hellowControl
{
    public class SunHellowControl : HellowControl
    {
        protected override System.Web.UI.HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Table;
            }
        }
        //重写control类的RenderContents来组织父类中创建的控件
        protected override void RenderContents(HtmlTextWriter writer)
        {
            EnsureChildControls();//如果ChildControlsCreated不为true则调用CreateChildControls
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
            writer.AddAttribute(HtmlTextWriterAttribute.Width, "360px");
            writer.RenderBeginTag(HtmlTextWriterTag.Td);
            writer.Write("your name:");
            writer.RenderEndTag();             writer.RenderBeginTag(HtmlTextWriterTag.Td);
            _input.RenderControl(writer);//输出第一子个控件
            writer.RenderEndTag();             writer.RenderBeginTag(HtmlTextWriterTag.Td);
            _rqrvalidatator.RenderControl(writer);
            _regvalidator.RenderControl(writer);
            writer.RenderEndTag();             writer.RenderEndTag();         }
    }
}
这样控件就按我们的要求输出了

我发现我的工具箱针对这个控件的图标是一个齿轮
我想把他换成我自己的个性化ICO图标
1:做一个16*16象素和控件同名的bmp图片,放在和控件相同的目录下
2:属性设置成"嵌入的资源",重新选择项...

如果想让控件拖到aspx页面上去的时候是这样的形式
<asp:SunHellowControl ID="SunHellowControl1" runat="server" />
那么我们可以在控件的AssemblyInfo.cs文件中
插入
[assembly: TagPrefix("hellowControl", "asp")]
第一个参数是类库的名称空间,第二个就不用说了
注意AssemblyInfo.cs要引用System.Web.UI名称空间

七:理解控件的运行机制(例:基于CompositeControl命名空间的控件)的更多相关文章

  1. 六:理解控件的运行机制(例:基于WebControl命名空间的控件)

    Control类的Render方法在WebControl类中被被分成三部分1:RenderBeginTag,呈现标签的开始2:RenderContents,呈现标签的内容3:RenderEndTag, ...

  2. 五:理解控件的运行机制(例:基于Control命名空间的简单控件)

    一:先用最简短的话说点理论的1.asp.net中所有的标准控件都可以重写 2.和控件相关的命名空间有 System.Web.UI.Control是所有控件的基类只提供简单的呈现逻辑,不支持样式表 Sy ...

  3. 四:理解Page类的运行机制(例:基于PageStatePersister的页面状态存取)

    有人说类似gridview datalist这样的控件最好不要用在高并发,IO大的网站中企业应用中为了快速开发到可以用一用因为这是一类"沉重"的组件我们姑且不谈这种看法的正确性(我 ...

  4. 二:理解ASP.NET的运行机制(例:基于HttpHandler的URL重写)

    url重写就是把一些类似article.aspx?id=28的路径重写成 article/28/这样的路径 当用户访问article/28/的时候我们通过asp.net把这个请求重定向到article ...

  5. 三:理解Page类的运行机制(例:在render方法中生成静态文件)

    我这里只写几个常用的事件1.OnPreInit:此事件后将加载个性化信息和主题2.OnInit:初始化页面中服务器控件的默认值但控件的状态没有加载,没有创建控件树3.OnPreLoad:控件完成状态和 ...

  6. 一:理解ASP.NET的运行机制(例:通过HttpModule来计算页面执行时间)

    一:简要介绍一下asp.net的执行步骤 1.IIS接收到客户请求 2. IIS把请求交给aspnet_isapi.dll处理 3.(如果是第一次运行程序)装载bin目录中的dll 4.(如果是第一次 ...

  7. 一张图,理解JAVA体系结构、运行机制、JVN运行机制、Java平台(初学)

    初学JAVA,学一门语言不仅仅是学其语法,逻辑思维能力,还有每一门语言都有自己独特的一方面,所以才有那么多语言要学啊 = =,所以想要真的学好语言,其编译机制,运行机制多少也要涉猎一些啊.这是初学JA ...

  8. 全面理解Java异常的运行机制

    1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话. ...

  9. 万字长文,带你彻底理解EF Core5的运行机制,让你成为团队中的EF Core专家

    在EF Core 5中,有很多方式可以窥察工作流程中发生的事情,并与该信息进行交互.这些功能点包括日志记录,拦截,事件处理程序和一些超酷的最新出现的调试功能.EF团队甚至从Entity Framewo ...

随机推荐

  1. eclipse中集成python开发环境

    转载:https://www.cnblogs.com/mywood/p/7272487.html Eclipse简介 Eclipse是java开发最常用的IDE,功能强大,可以在MAC和Windos上 ...

  2. MySQL优化(二) 优化诀窍

    一.索引的使用 (1)查询要使用索引最重要的条件是查询条件中的字段建立了索引: (2)下列几种情况可能使用到索引: <1> 对于创建的多列索引,只要查询条件使用了最坐边的列,索引一般就会被 ...

  3. 探索未知种族之osg类生物--渲染遍历之GraphicsContext::runOperations

    osg::GraphicsContext::runOperations().我们先来看一下这个函数的执行过程. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  4. 用ps增加照片的气氛--镜头光晕

    1.寻找一张图片 2.新建一个图层填充为黑色 3.选择滤镜---渲染---镜头光晕 4.选择图层模式---滤色. ​ 编辑:千锋UI设计

  5. [Hadoop]Hadoop章1 Hadoop原理解析

    Hadoop是Apache软件基金会所开发的并行计算框架与分布式文件系统.最核心的模块包括Hadoop Common.HDFS与MapReduce. HDFS HDFS是Hadoop分布式文件系统(H ...

  6. 接口测试3A原则

    手工的功能测试用例也可以用3A原则来编写. Arrange: 准备被测功能相关的测试数据,比如往系统里录入一批工单以便测试工单的分页功能 Act : 调用被测的功能,实际上这就是我们一直讲的测试步骤 ...

  7. golang注意问题

    关于slice 我们都知道slice是在通过参数传递的时候传递的是引用 slice的appen操作是有返回值的,并不改变原值 例如 b := [],,,} c:=append(b, ) // b 不变 ...

  8. css3简单旋转

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>&l ...

  9. bash编程-cut、printf

    1. cut cut命令用于从行中截取字符串. SYNOPSIS cut OPTION... [FILE]... ** OPTION** -d CHAR:以指定的字符为分隔符(不要用空格作为分隔符): ...

  10. SDWebImage之SDWebImageDownloader

    SDWebImageDownloader完成了对网络图片的异步下载工作,准确说这个类是一个文件下载的工具类,真正的网络请求是在继承于NSOperation的SDWebImageDownloaderOp ...