怎么来自定义控件

ASP.NET自定义控件初探
本文分享了作者在ASP.NET项目中学习并使用自定义控件的经验,特别是通过反编译.NET库来深入了解控件实现的过程。文章介绍了如何使用Reflector反编译器,并以Label控件为例,解析其内部实现细节。
自己对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类了
ContractedBlock.gif ExpandedBlockStart.gif Code
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 { getset; }
    
internal bool AssociatedControlInControlTree { getset; }
    
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 { getset; }
}

 
Expand Methods
 

这些是Label内置成员,写过自定义控件的朋友都知道,一般要重载Control类的Render方法,.net库中带的控件类,也不例外,也是要重载这个方法的
Label比较简单,我们托一个页面可以看到其生成html为
< span id = " Label1 " > Label </ span >
相当简单的,我们可以写这样一个类来模拟Label类
ContractedBlock.gif ExpandedBlockStart.gif Code
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()
ContractedBlock.gif ExpandedBlockStart.gif Code
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
http://www.cnblogs.com/tonyqus/archive/2005/02/15/104576.html

转载于:https://www.cnblogs.com/20090802/archive/2009/09/03/1559212.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值