怎么来自定义控件
2011-08-16 00:31
225 查看
自己对C#与.net的学习并不算深入,只是这段时间要用asp.net来做项目,也是出去无奈,只好好的学习了一番,学完后,感觉的确很好,加上Vs
的集成开发环境,这个开发的确迅速,而且容易上手,项目很快就要完工了,现在来总结点当时没顾得上总结的东西,决定深入下.net
在开发
项目的时候,其实我根本就不知道怎么去做自定义控件,有一个复选框级联选择的功能,我用的是ThreeView控件做的,当时并不知道怎么去添加
TreeView子节点控件的响应事件,应是用js+dom在客户端添加TreeView生成html元素的事件,很麻烦也费力,也不便维护。
所以这次深入,决定先从自定义控件入手,看了一些资料,关于自定义的控件的。自己想了想如果能够知道.net控件库中的控件类是怎么写的,那不更好的操纵已有的控件和更好地开发自定义控件。到网上找了下,就在博客园上找到了一个C#反编译器Reflector(下载地址http://downloads.red-gate.com/reflector.zip),很好用,能够把.net库给反编译出来。
从自己的几乎开始,先看控件部分的,按照Vs中工具箱面板中的控件顺序看看,这些控件类的源代码
第一个当然是简单的Label类了
这些是Label内置成员,写过自定义控件的朋友都知道,一般要重载Control类的Render方法,.net库中带的控件类,也不例外,也是要重载这个方法的
Label比较简单,我们托一个页面可以看到其生成html为
相当简单的,我们可以写这样一个类来模拟Label类
在aspx对应的cs文件的load方法中写入如下代码
我们可以看到结果的html和.net库中的Label(少了id,呵呵)是一样的,当然了,这只是一种,很简单的模仿,如果Label的其他属性设置了,html内容就会变化的
看上门的Label的源码,大家并没有看到Label中重载Render方法是吧,其实这个是在 RenderContents方法中调用了父类WebControl的Rende方法,而WebControl中实现了对Render方法的重载。
看看Label.RenderContents()
而我们自定义控件的时候,经常直接从Control继承,虽然是WebControl性质的,虽然有WebControl,但是很多就是喜欢从
Control来继承,不知道为什么,不过我并不怎么赞成。毕竟那样从软件设计上来看就是一种冗余吧,也许WebControl不符合很多朋友们的使用
吧。
在Label中AddAttributesToRender方法实现了动态添加属性和显示属性。
我的学习方法就是从表面上知道好东东怎么用之后,就开始深入,了解其运行机制、实现原理,那样就可以很轻松地把整个框架系统的理解下来,可以上下统一,以后做东西可以不管底层的东西,但做起来可以游刃有余。
这里有个HtmlWriterText类,估计有的朋友不知道是干啥子用的,我找了两篇文章,不明白的朋友可以看下
http://msdn.microsoft.com/zh-cn/library/system.web.ui.htmltextwriter(VS.80).aspx
/article/4620534.html
的集成开发环境,这个开发的确迅速,而且容易上手,项目很快就要完工了,现在来总结点当时没顾得上总结的东西,决定深入下.net
在开发
项目的时候,其实我根本就不知道怎么去做自定义控件,有一个复选框级联选择的功能,我用的是ThreeView控件做的,当时并不知道怎么去添加
TreeView子节点控件的响应事件,应是用js+dom在客户端添加TreeView生成html元素的事件,很麻烦也费力,也不便维护。
所以这次深入,决定先从自定义控件入手,看了一些资料,关于自定义的控件的。自己想了想如果能够知道.net控件库中的控件类是怎么写的,那不更好的操纵已有的控件和更好地开发自定义控件。到网上找了下,就在博客园上找到了一个C#反编译器Reflector(下载地址http://downloads.red-gate.com/reflector.zip),很好用,能够把.net库给反编译出来。
从自己的几乎开始,先看控件部分的,按照Vs中工具箱面板中的控件顺序看看,这些控件类的源代码
第一个当然是简单的Label类了
DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ControlValueProperty("Text"), ControlBuilder(typeof(LabelControlBuilder)), DefaultProperty("Text"), ParseChildren(false), Designer("System.Web.UI.Design.WebControls.LabelDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), ToolboxData("<{0}:Label runat=\"server\" Text=\"Label\"></{0}:Label>"), AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] public class Label : WebControl, ITextControl { // Methods public Label(); internal Label(HtmlTextWriterTag tag); protected override void AddAttributesToRender(HtmlTextWriter writer); protected override void AddParsedSubObject(object obj); protected override void LoadViewState(object savedState); protected internal override void RenderContents(HtmlTextWriter writer); // Properties [WebCategory("Accessibility"), Themeable(false), IDReferenceProperty, TypeConverter(typeof(AssociatedControlConverter)), DefaultValue(""), WebSysDescription("Label_AssociatedControlID")] public virtual string AssociatedControlID { get; set; } internal bool AssociatedControlInControlTree { get; set; } internal override bool RequiresLegacyRendering { get; } protected override HtmlTextWriterTag TagKey { get; } [PersistenceMode(PersistenceMode.InnerDefaultProperty), WebCategory("Appearance"), Bindable(true), DefaultValue(""), WebSysDescription("Label_Text"), Localizable(true)] public virtual string Text { get; set; } }
这些是Label内置成员,写过自定义控件的朋友都知道,一般要重载Control类的Render方法,.net库中带的控件类,也不例外,也是要重载这个方法的
Label比较简单,我们托一个页面可以看到其生成html为
<span id="Label1">Label</span>
相当简单的,我们可以写这样一个类来模拟Label类
public class MyLabel : Control { public MyLabel() { } protected override void Render(HtmlTextWriter writer) { writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.Write("Label"); writer.RenderEndTag(); } }
在aspx对应的cs文件的load方法中写入如下代码
protected void Page_Load(object sender, EventArgs e) { MyLabel ml = new MyLabel(); this.form1.Controls.Add(ml); }
我们可以看到结果的html和.net库中的Label(少了id,呵呵)是一样的,当然了,这只是一种,很简单的模仿,如果Label的其他属性设置了,html内容就会变化的
看上门的Label的源码,大家并没有看到Label中重载Render方法是吧,其实这个是在 RenderContents方法中调用了父类WebControl的Rende方法,而WebControl中实现了对Render方法的重载。
看看Label.RenderContents()
protected internal override void RenderContents(HtmlTextWriter writer) { if (base.HasRenderingData()) { base.RenderContents(writer); } else { writer.Write(this.Text); } }
而我们自定义控件的时候,经常直接从Control继承,虽然是WebControl性质的,虽然有WebControl,但是很多就是喜欢从
Control来继承,不知道为什么,不过我并不怎么赞成。毕竟那样从软件设计上来看就是一种冗余吧,也许WebControl不符合很多朋友们的使用
吧。
在Label中AddAttributesToRender方法实现了动态添加属性和显示属性。
我的学习方法就是从表面上知道好东东怎么用之后,就开始深入,了解其运行机制、实现原理,那样就可以很轻松地把整个框架系统的理解下来,可以上下统一,以后做东西可以不管底层的东西,但做起来可以游刃有余。
这里有个HtmlWriterText类,估计有的朋友不知道是干啥子用的,我找了两篇文章,不明白的朋友可以看下
http://msdn.microsoft.com/zh-cn/library/system.web.ui.htmltextwriter(VS.80).aspx
/article/4620534.html
相关文章推荐
- 怎么来自定义控件
- 从源码中浅析Android中怎么利用attrs和styles定义控件
- 获取来自定义控件(继承自Contro基类)的定义在Generic.xaml或其他*.xaml中的对象
- 直接继承View来自定义控件时,需要重写onMeasure()方法并设置wrap_content时的大小 原理分析
- Android中使用shape来自定义控件显示
- 使用透明效果来自定义文件上传按钮控件样式
- 使用透明效果来自定义文件上传按钮控件样式
- duilib中加入自己定义控件之后怎么可以在xml文件里配置使用
- 继承ViewGroup及其子类LinearLayout来自定义容器控件
- 获取来自定义控件(继承自Contro基类)的定义在Generic.xaml或其他*.xaml中的对象
- 如何使用xib来自定义控件
- 获取来自定义控件(继承自Contro基类)的定义在Generic.xaml或其他*.xaml中的对象
- android CheckBox控件的定义及事件监听
- Demo: Dictionary>> 泛型读取XML文件数据作为数据源(DataSource)绑定到DropDownList控件 定义个一个公用类
- android页面布局时定义控件ID时@id/XX和@+id/xx 有什么区别
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- (转载)怎么看到有的代码定义变量用var $a是什么意思?
- 《第一行代码》学习笔记-- 基础的自定义标题控件的定义和使用
- 使用butterknife轻松定义控件
- Android开发之接受来自Appwidget的广播、更新Appwidget控件的状态