Control类程序按控件的步骤:

呈现控件的步骤

1.RenderControl方法

代码如下:

protected void RenderControl(HtmlTextWriter writer)

{

if(Visible)

{

Render(writer);
}

}

先判断Visible,然后进行Render.

2.Render方法

public virtual void Render(HtmlTextWriter writer)

{

RenderChildren(writer);

}

使用HtmlTextWriter将标记字符和文本输出,然后调用RenderChildren方法.

3.RenderChildren方法

public virtual void RenderChildren(HtmlTextWriter writer)

{

for(Control c in Controls)

{

c.RenderControl(writer);

}

}

判断当前控件是否有子控件,然后调用RenderControl方法,根据子控件的visible值输出子控件.

下面来看一下控件的事件处理.

1.我们知道Button有一个Click事件,我们打开vs,导航至Button的定义,可以看到如下:

public class Button : WebControl, IButtonControl, IPostBackEventHandler
{
}

其中IPostBackEventHandler接口是负责处理回发事件的.如果自定义空间需要处理回发事件,那么就实现该接口就可以了,我们查看该接口:

    // 摘要://     定义 ASP.NET 服务器控件为处理回发事件而必须实现的方法。public interface IPostBackEventHandler{// 摘要://     当由类实现时,使服务器控件能够处理将窗体发送到服务器时引发的事件。//// 参数://   eventArgument://     表示要传递到事件处理程序的可选事件参数的 System.String。void RaisePostBackEvent(string eventArgument);}

在该接口的RaisePostBackEvent方法中,有一个参数,该参数表示的是要传递给处理程序的参数.

处理回发事件的步骤如下:

1.自定义服务器控件类必须实现IPostBackEventHandler接口,并实现该接口成员RaisePostBackEvent方法

2.为表单定义UniqueID,以与IPostBackEventHandler服务器控件的UniqueID相对应.

注意:只有为引起回传的控件的name属性分配了UniqueID,才能够正确实现捕获回传事件。

例子如下:

    public class Btn : Control,IPostBackEventHandler{public event EventHandler click;public void RaisePostBackEvent(string eventArgument){if (click != null){click(this, EventArgs.Empty);}}protected override void Render(HtmlTextWriter writer){writer.Write("<input type='submit' name='" + this.UniqueID + "' value='click me!'/>");}}

页面调用:

    <cc1:Btn ID="Btn1" runat="server" οnclick="Btn1_click"></cc1:Btn><asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>protected void Btn1_click(object sender, EventArgs e){Label1.Text = "点击事件!";}
注意:
EventArgs.Empty表示没有事件数据的事件,而不是表示空事件!
此时,如果控件中存在多个时间,编译器将会为每一个事件委托生成一个字段,这样的效率是比较低的,可以采用另一种方式来对事件处理进行优化:
我们可以使用EventHandlerList,该类有几个重要的方法,具体如下:
        public void AddHandler(object key, Delegate value);public void AddHandlers(EventHandlerList listToAddFrom);public void RemoveHandler(object key, Delegate value);
示例:
    public class Btn : Control, IPostBackEventHandler{private static readonly object EventDBClick = new object();public event EventHandler DBClick{add{Events.AddHandler(EventDBClick, value);}remove{Events.RemoveHandler(EventDBClick, value);}}public void RaisePostBackEvent(string eventArgument){OnDBClick(EventArgs.Empty);}protected virtual void OnDBClick(EventArgs e){EventHandler handler = (EventHandler)Events[EventDBClick];if (handler != null){handler(this, e);}}protected override void Render(HtmlTextWriter writer){writer.Write("<input type='submit' name='" + this.UniqueID + "' value='click me!'/>");}}

转载于:https://www.cnblogs.com/oneword/archive/2009/12/23/1630962.html

自定义控件--基础2相关推荐

  1. Android 自定义控件基础:measure过程

    measure过程要分为两种情况:如果是原始的View,需要通过measure 方法就完成其测量过程:如果是ViewGroup,除了完成自己的测量过程外,还会遍历去调用所有子元素的measure方法, ...

  2. silverlight 自定义控件基础篇(仿淘宝评论星级控件)

    首先说说今天的控件能干什么? 1,仿淘宝的评论星级控件,鼠标滑过星星,会变亮. 2,可以用来,展示某一类对象的状态,或者统计信息,比如说,某一类对象,有1~10不同的状态,10为满状态,那么该控件就能 ...

  3. android自定义流式布局思路,Android 自定义控件基础-流式布局

    什么是流式布局?其实我们在平时遇到过,只是有可能叫不出它的名字. 如图: 如上图,就是一个流式布局的样式. &esmp;这里,将记录一下怎么实现这个功能.其实实现这个功能的方法,就是自定义Vi ...

  4. Android 自定义控件基础:MeasureSpec

    前言 MeasureSpec 很大程度上决定了一个View尺寸规格,是因为这个过程还受父容器的影响,因为父容器影响View 的MeasureSpec的创建过程.在测量过程中,系统会将View的Layo ...

  5. 自定义控件android.r,Android控件架构与自定义控件

    前言 最近在开发的路上越走越远了,每天在看各位大神公众号更新内容是自定义View的时候,一些小的内容有点模具,决定回过头来温习一下过往的内容.此篇也是根据android群英传来总结的一篇文章. 1 A ...

  6. 《Programming WPF》翻译 目录

    原文:<Programming WPF>翻译 目录 注:第1.2章我只做了笔记,没有翻译,请大家阅读时注意. 还有就是,这本书的英文版本下载:[O'Reilly] Programming ...

  7. 分享Silverlight/WPF/Windows Phone一周学习导读(8月15日-8月19日)

    分享Silverlight/WPF/Windows Phone一周学习导读(8月15日-8月19日) 本周Silverlight学习资源更新: Silverlight Tools 4安装时的错误提示 ...

  8. C#制作WinForm控件

    转:http://www.cnblogs.com/salonliudong/archive/2007/04/29/732524.html 自定义控件基础知识 一.概述 Windows 窗体控件是可再次 ...

  9. 2018年终总结(兼个人详历) | 2018 与我的技术之路

    零.前言 2017年标签:"海的彼岸,有我未曾见证的风采" 2018年标签:"海的彼岸,吾在征途" 复制代码 简述: 1).2018年基本上都是在总结Andro ...

最新文章

  1. eclipse删除perspective
  2. CSS添加多个背景图片
  3. 全球与中国激光投影设备市场前景规划与发展战略建议报告2022-2028年版
  4. leetcode 519. Random Flip Matrix | 519. 随机翻转矩阵(洗牌算法Fisher–Yates shuffle)
  5. HBase、Redis、MongoDB、Couchbase、LevelDB主流 NoSQL 数据库的对比
  6. 性能优化之图片懒加载
  7. 顺序程序设计03 - 零基础入门学习C语言09
  8. springboot实现拦截器
  9. c语言中汉字属于什么类型_练字应该练什么之:汉字基本结构的类型
  10. 10天基于STM32F401RET6智能锁项目实战第1天(环境搭建和新建工程)
  11. spring boot 在IDEA使用devtools热布署不成功,都没有注意的事!
  12. 改变button中文字的对齐方式
  13. 项目管理工具_项目管理工具MS Project使用经验分享
  14. win10动态桌面_需要2020考研倒计时的动态桌面源的亲们在此留言
  15. iOS性能优化之内存篇
  16. 2022春季苹果发布会将会发布什么?
  17. ES6入门:模板字符串
  18. 【郝斌 C语言 笔记】自增
  19. 甄别客户需求,提高解决问题的效率
  20. ACM-ICPC 2017 Asia QingDao:喜,抑或是悲?幸运,抑或是倒霉?退役!!!

热门文章

  1. java工程webservice的应用案例
  2. Strutsw2与Spring整合流程-简述
  3. 2022-2028年中国香精香料行业投资分析及前景预测报告
  4. 语音识别(ASR)评估指标-WER(字错误率)和SER(句错误率)
  5. IDEA : Git Pull Failed 解决(IDEA中使用stash功能)
  6. 回归算法 - 线性回归求解 θ(最大似然估计求解)
  7. 最全Pycharm教程(43)——Pycharm扩展功能之UML类图使用 代码结构
  8. LeetCode简单题之检查某单词是否等于两单词之和
  9. TVM交叉编译和远程RPC
  10. 稀疏自编码器及TensorFlow实现