自定义控件--基础2
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相关推荐
- Android 自定义控件基础:measure过程
measure过程要分为两种情况:如果是原始的View,需要通过measure 方法就完成其测量过程:如果是ViewGroup,除了完成自己的测量过程外,还会遍历去调用所有子元素的measure方法, ...
- silverlight 自定义控件基础篇(仿淘宝评论星级控件)
首先说说今天的控件能干什么? 1,仿淘宝的评论星级控件,鼠标滑过星星,会变亮. 2,可以用来,展示某一类对象的状态,或者统计信息,比如说,某一类对象,有1~10不同的状态,10为满状态,那么该控件就能 ...
- android自定义流式布局思路,Android 自定义控件基础-流式布局
什么是流式布局?其实我们在平时遇到过,只是有可能叫不出它的名字. 如图: 如上图,就是一个流式布局的样式. &esmp;这里,将记录一下怎么实现这个功能.其实实现这个功能的方法,就是自定义Vi ...
- Android 自定义控件基础:MeasureSpec
前言 MeasureSpec 很大程度上决定了一个View尺寸规格,是因为这个过程还受父容器的影响,因为父容器影响View 的MeasureSpec的创建过程.在测量过程中,系统会将View的Layo ...
- 自定义控件android.r,Android控件架构与自定义控件
前言 最近在开发的路上越走越远了,每天在看各位大神公众号更新内容是自定义View的时候,一些小的内容有点模具,决定回过头来温习一下过往的内容.此篇也是根据android群英传来总结的一篇文章. 1 A ...
- 《Programming WPF》翻译 目录
原文:<Programming WPF>翻译 目录 注:第1.2章我只做了笔记,没有翻译,请大家阅读时注意. 还有就是,这本书的英文版本下载:[O'Reilly] Programming ...
- 分享Silverlight/WPF/Windows Phone一周学习导读(8月15日-8月19日)
分享Silverlight/WPF/Windows Phone一周学习导读(8月15日-8月19日) 本周Silverlight学习资源更新: Silverlight Tools 4安装时的错误提示 ...
- C#制作WinForm控件
转:http://www.cnblogs.com/salonliudong/archive/2007/04/29/732524.html 自定义控件基础知识 一.概述 Windows 窗体控件是可再次 ...
- 2018年终总结(兼个人详历) | 2018 与我的技术之路
零.前言 2017年标签:"海的彼岸,有我未曾见证的风采" 2018年标签:"海的彼岸,吾在征途" 复制代码 简述: 1).2018年基本上都是在总结Andro ...
最新文章
- eclipse删除perspective
- CSS添加多个背景图片
- 全球与中国激光投影设备市场前景规划与发展战略建议报告2022-2028年版
- leetcode 519. Random Flip Matrix | 519. 随机翻转矩阵(洗牌算法Fisher–Yates shuffle)
- HBase、Redis、MongoDB、Couchbase、LevelDB主流 NoSQL 数据库的对比
- 性能优化之图片懒加载
- 顺序程序设计03 - 零基础入门学习C语言09
- springboot实现拦截器
- c语言中汉字属于什么类型_练字应该练什么之:汉字基本结构的类型
- 10天基于STM32F401RET6智能锁项目实战第1天(环境搭建和新建工程)
- spring boot 在IDEA使用devtools热布署不成功,都没有注意的事!
- 改变button中文字的对齐方式
- 项目管理工具_项目管理工具MS Project使用经验分享
- win10动态桌面_需要2020考研倒计时的动态桌面源的亲们在此留言
- iOS性能优化之内存篇
- 2022春季苹果发布会将会发布什么?
- ES6入门:模板字符串
- 【郝斌 C语言 笔记】自增
- 甄别客户需求,提高解决问题的效率
- ACM-ICPC 2017 Asia QingDao:喜,抑或是悲?幸运,抑或是倒霉?退役!!!