七:理解控件的运行机制(例:基于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名称空间
七:理解控件的运行机制(例:基于CompositeControl命名空间的控件)的更多相关文章
- 六:理解控件的运行机制(例:基于WebControl命名空间的控件)
Control类的Render方法在WebControl类中被被分成三部分1:RenderBeginTag,呈现标签的开始2:RenderContents,呈现标签的内容3:RenderEndTag, ...
- 五:理解控件的运行机制(例:基于Control命名空间的简单控件)
一:先用最简短的话说点理论的1.asp.net中所有的标准控件都可以重写 2.和控件相关的命名空间有 System.Web.UI.Control是所有控件的基类只提供简单的呈现逻辑,不支持样式表 Sy ...
- 四:理解Page类的运行机制(例:基于PageStatePersister的页面状态存取)
有人说类似gridview datalist这样的控件最好不要用在高并发,IO大的网站中企业应用中为了快速开发到可以用一用因为这是一类"沉重"的组件我们姑且不谈这种看法的正确性(我 ...
- 二:理解ASP.NET的运行机制(例:基于HttpHandler的URL重写)
url重写就是把一些类似article.aspx?id=28的路径重写成 article/28/这样的路径 当用户访问article/28/的时候我们通过asp.net把这个请求重定向到article ...
- 三:理解Page类的运行机制(例:在render方法中生成静态文件)
我这里只写几个常用的事件1.OnPreInit:此事件后将加载个性化信息和主题2.OnInit:初始化页面中服务器控件的默认值但控件的状态没有加载,没有创建控件树3.OnPreLoad:控件完成状态和 ...
- 一:理解ASP.NET的运行机制(例:通过HttpModule来计算页面执行时间)
一:简要介绍一下asp.net的执行步骤 1.IIS接收到客户请求 2. IIS把请求交给aspnet_isapi.dll处理 3.(如果是第一次运行程序)装载bin目录中的dll 4.(如果是第一次 ...
- 一张图,理解JAVA体系结构、运行机制、JVN运行机制、Java平台(初学)
初学JAVA,学一门语言不仅仅是学其语法,逻辑思维能力,还有每一门语言都有自己独特的一方面,所以才有那么多语言要学啊 = =,所以想要真的学好语言,其编译机制,运行机制多少也要涉猎一些啊.这是初学JA ...
- 全面理解Java异常的运行机制
1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话. ...
- 万字长文,带你彻底理解EF Core5的运行机制,让你成为团队中的EF Core专家
在EF Core 5中,有很多方式可以窥察工作流程中发生的事情,并与该信息进行交互.这些功能点包括日志记录,拦截,事件处理程序和一些超酷的最新出现的调试功能.EF团队甚至从Entity Framewo ...
随机推荐
- Python中使用RabbitMQ
一 RabbitMQ简介 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息 ...
- osg探究补充:osg数据加载原理(插件机制简介)
前言 我们接着昨天的继续,昨天主要是讲解了DatabasePager类中的特定的成员变量以及run函数的第一部分,对所要请求加载的数据按照是否是网络数据进行分类加载模式.今天我们就看看数据是怎们加载到 ...
- BZOJ4380 Myjnie / Luogu3592 [POI2015]MYJ-区间DP
Description 有$n$家洗车店从左往右排成一排,每家店都有一个正整数价格$p[i]$. 有$m$个人要来消费,第$i$个人会驶过第$a[i]$个开始一直到第$b[i]$个洗车店,且会选择这些 ...
- Python:每日一题003
题目: 一个整数,它加上100和加上268后都是一个完全平方数,请问该数是多少? 程序分析: 在10000以内判断,将该数加上100后再开方,加上268后再开方,如果开方后的结果满足如下条件,即是结果 ...
- goaccess
找了各种工具,最终还是觉得goaccess不仅图文并茂,而且速度快,每秒8W 的日志记录解析速度,websocket10秒刷新统计数据,站在巨人肩膀上你也会看得更远…先上图: 具体方案如下步骤: 一 ...
- 学习爬虫Scrapy遇到的错误
1. 这个问题是由于路径中含有中文,导致编码格式出错的问题, 查看错误方法,进入到ntpath.py文件中去,找到85行,然后,print 一下result_path,因为后面报出的错误,就是因为这段 ...
- MVC 移动识别
ASP.NET MVC移动端识别 上面我们已经说了 响应式布局,但那是客户端的,针对于同一个视图页面的.不过 同一个视图页面 通过响应式布局 也是有缺点的 会导致页面 样式十分庞大 页面加载效率降低, ...
- 【部署问题】解决Nginx: [error] open() "/usr/local/Nginx/logs/Nginx.pid" failed(2:No such file or directory)
问题:环境问题 解决方法: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 使用nginx -c的参数指定nginx.c ...
- python模块:configparser
"""Configuration file parser. A configuration file consists of sections, lead by a &q ...
- JS 的execCommand 方法 做的一个简单富文本
execCommand 当一个 HTML 文档切换到设计模式(designMode)时,文档对象暴露 execCommand 方法,该方法允许运行命令来操纵可编辑区域的内容.大多数命令影响文档的选择( ...