七:理解控件的运行机制(例:基于CompositeControl命名空间的控件)

组合控件与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名称空间

时间: 2024-11-05 16:22:49

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

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

Control类的Render方法在WebControl类中被被分成三部分1:RenderBeginTag,呈现标签的开始2:RenderContents,呈现标签的内容3:RenderEndTag,呈现标签的结束 一般情况下不重写RenderBeginTag和RenderEndTagRenderBeginTag生成什么样的标签由WebControl.TagKey和WebControl.TagName决定默认的TagKey是Span(假设你想直接输出文本,那么你重写的TagKey是Unknown

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

一:先用最简短的话说点理论的1.asp.net中所有的标准控件都可以重写 2.和控件相关的命名空间有 System.Web.UI.Control是所有控件的基类只提供简单的呈现逻辑,不支持样式表 System.Web.UI.WebControls.WebControl继承自Control支持控件外观 System.Web.UI.WebControls.CompositeControl继承自WebControl类派生出多个控件合成的复合控件 3.控件树的实现原理首先Page类本身就是一个控件,它继

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

 有人说类似gridview datalist这样的控件最好不要用在高并发,IO大的网站中企业应用中为了快速开发到可以用一用因为这是一类"沉重"的组件我们姑且不谈这种看法的正确性(我个人觉得有道理)只谈它为什么笨重: 因为这些控件给页面带来了大量的viewstate<input type="hidden" name="____VIEWSTATE" id="____VIEWSTATE" value=这就是页面状态一个页面里

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

url重写就是把一些类似article.aspx?id=28的路径重写成 article/28/这样的路径 当用户访问article/28/的时候我们通过asp.net把这个请求重定向到article.aspx?id=28路径有两种方法可以做这件事情 一:基于HttpModule的方案这个方案有有缺点,具体缺点以后再谈我曾写过一篇文章<不用组件的url重写(适用于较大型项目) >就是按这个模式写的 二:基于HttpHandler的方案我们这个例子就是按这个方案做的我们接下来就按这种方式做这个例

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

一:简要介绍一下asp.net的执行步骤 1.IIS接收到客户请求 2. IIS把请求交给aspnet_isapi.dll处理 3.(如果是第一次运行程序)装载bin目录中的dll 4.(如果是第一次运行程序)读取各级webconfig中的配置 5.(如果是第一次运行程序)编译装载global.asax,初始化HttpApplication实例 6.创建响应请求的HttpContext 7.创建承载响应结果的HttpTextWriter 8.找到合适的HttpHandler(asp.net页面)

深入理解Android Instant Run运行机制

Instant Run Instant Run,是android studio2.0新增的一个运行机制,在你编码开发.测试或debug的时候,它都能显著减少你对当前应用的构建和部署的时间.通俗的解释就是,当你在Android Studio中改了你的代码,Instant Run可以很快的让你看到你修改的效果.而在没有Instant Run之前,你的一个小小的修改,都肯能需要几十秒甚至更长的等待才能看到修改后的效果. 传统的代码修改及编译部署流程 传统的代码修改及编译流程如下:构建整个apk → 部

基于MFC的ActiveX控件,如何实现运行时,用户可动态调整控件大小和位置?

问题描述 基于MFC的ActiveX控件,如何实现运行时,用户可动态调整控件大小和位置? 基于MFC的ActiveX控件,如何实现运行时,用户可动态调整控件大小和位置? 请大神们帮帮忙.在线等. 解决方案 调整控件大小是宿主程序的事,不关activex 即便不写任何代码,都是可以调整大小的,只是如果你不写代码,调整控件大小,里面的内容不会跟着缩放,而是保持不变,如果尺寸变小,右下角的东西会看不见. 解决方案二: 在OnSize中写可动态调整控件大小和位置的代码 解决方案三: 有没有相关的列子可供

068_《Delphi7控件实用程序设计100例》

<Delphi7控件实用程序设计100例> Delphi 教程 系列书籍 (068) <Delphi7控件实用程序设计100例> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf 作者: 段兴 宋雷 张敬韶 孙丽娜 丛书名: 程序设计实例丛书 出版社:人民邮电出版社 ISBN:7115112975 上架时间:2003-7-21 出版日期:2003 年6月 开本:16开 页码:332 版次:1-1 内容简介 本书选取了利用Delphi 7开发的控件方面

090_《Delphi6控件实用程序设计100例》

<Delphi6控件实用程序设计100例> Delphi 教程 系列书籍 (090) <Delphi6控件实用程序设计100例> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Part1 Part2 Part3 作者: 段兴 丛书名: 数据库与控件程序设计实例丛书 出版社:人民邮电出版社 ISBN:7115106290 上架时间:2002-11-4 出版日期:2002 年10月 开本:16开 页码:330 版次:1-1 内容简介 本书选取了利用Delph