热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

复合控件Asp.net2.0

每次都从最原始的方法去写一些复杂的控件是不是很郁闷呢?如何可以简单的利用现有的控件来制作复合控件呢?一个很简单的例子看一下就明白了。1[ToolboxD
每次都从最原始的方法去写一些复杂的控件是不是很郁闷呢?

如何可以简单的利用现有的控件来制作复合控件呢?

一个很简单的例子看一下就明白了。
 1 [ToolboxData("<{0}:WebCustomControl1 runat&#61;server>")]
 2    public class WebCustomControl1 : CompositeControl
 3    {
 4        public TextBox txt1 &#61; new TextBox();
 5        public Label lab &#61; new Label();
 6        public Button b &#61; new Button();
 7        public WebCustomControl1()
 8        {
 9            b.Text &#61; "Click me";
10            txt1.ID &#61; "kkk";
11            b.Click &#43;&#61; new EventHandler(b_Click);
12        }

13 
14        void b_Click(object sender, EventArgs e)
15        {
16            lab.Text &#61; txt1.Text;
17        }

18
19        protected override void OnInit(EventArgs e)
20        {
21           
22          
23            base.OnInit(e);
24        }

25
26        protected override void CreateChildControls()
27        {
28            this.Controls.Add(txt1);
29            this.Controls.Add(lab);
30            this.Controls.Add(b);
31           
32        }

33        protected override void RenderChildren(HtmlTextWriter writer)
34        {
35            txt1.RenderControl(writer);
36            b.RenderControl(writer);
37            lab.RenderControl(writer);
38           
39        }

40        protected override HtmlTextWriterTag TagKey
41        {
42            get
43            {
44                return HtmlTextWriterTag.Div;
45            }

46        }

控件的生命周期
 &#xff08;1&#xff09;初始化-- --在此阶段中&#xff0c;主要完成两项工作&#xff1a;一、初始化在传入Web请求生命周期内所需的设置&#xff1b;二、跟踪视图状态。首先&#xff0c;页面框架通过默认方式引发Init事件&#xff0c;并调用OnInit()方法&#xff0c;控件开发人员可以重写该方法为控件提供初始化逻辑。此后&#xff0c;页面框架将调用TrackViewState方法来跟踪视图状态。需要注意的是&#xff1a;多数情况下&#xff0c;Control基类提供的TrackViewState方法实现已经足够了。只有在控件定义了复杂属性时&#xff0c;开发人员才可能需要重写TrackViewState方法。

  &#xff08;2&#xff09;加载视图状态----此阶段的主要任务是检查服务器控件是否存在以及是否需要将其状态恢复到它在处理之前的请求结束的状态。因此该过程发生在页面回传过程中&#xff0c;而不是初始化请求过程。在此阶段&#xff0c;页面框架将自动恢复ViewState字典。如果服务器控件不维持其状态&#xff0c;或者它有能力通过默认方式保存其所有状态而使用ViewState字典&#xff0c;那么开发人员则不必实现任何逻辑。针对那些无法在 ViewState字典中存储的数据类型或者需要自定义状态管理的情况&#xff0c;开发人员可以通过重写LoadViewState方法来自定义状态的恢复和管理。

  &#xff08;3&#xff09;处理回发数据----若要使控件能够检查客户端发回的窗体数据&#xff0c;那么必须实现System.Web.UI.IPostBackDataHandler接口的 LoadPostData()方法。因此只有处理回发数据的控件参与此阶段。

  &#xff08;4&#xff09;加载----至此阶段开始&#xff0c;控件树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。此时&#xff0c;开发人员可以通过重写OnLoad()方法来实现每个请求共同的逻辑。

  &#xff08;5&#xff09;发送回发更改通知----在此阶段&#xff0c;服务器控件通过引发事件作为一种信号&#xff0c;表明由于回发而发生的控件状态变化&#xff08;因此该阶段仅用于回发过程&#xff09;。为了建立这种信号&#xff0c;开发人员必须再次使用System.Web.UI.IPostBackDataHandler接口&#xff0c;并实现另一方法- RaisePostBackChangedEvent()。其判断过程为&#xff1a;如果控件状态因回发而更改&#xff0c;则LoadPostData()返回true&#xff1b;否则返回false。页面框架跟踪所有返回true的控件并在这些控件上调用RaisePostDataChangedEvent()。

  &#xff08;6&#xff09;处理回发事件----该阶段处理引起回发的客户端事件。为了便于将客户端事件映射到服务器端事件上进行处理&#xff0c;开发人员在此阶段可以通过实现 System.Web.UI.IPostBackEventHandler接口的RaisePostBackEvent()方法来实现该逻辑。由此途径&#xff0c;服务器控件将成功捕获回发的客户端事件进行服务器端的相应处理。

  &#xff08;7&#xff09;预呈现----该阶段完成在生成控件之前所需要的任何工作。通常情况下是通过重写OnPreRender()方法完成该工作。需要注意的是&#xff1a;在该阶段&#xff0c;可以保存在预呈现阶段对控件状态所做的更改&#xff0c;而在呈现阶段进行的更改则会丢失。

  &#xff08;8&#xff09;保存状态----如果服务器控件不维持状态&#xff0c;或者它有能力通过默认方式保存其所有状态而使用ViewState字典&#xff0c;那么开发人员不必在该阶段实现任何逻辑。因为这个保存状态的过程是自动的。如果服务器控件需要自定义状态保存&#xff0c;或者控件无法在ViewState字典中存储特殊的数据类型&#xff0c;则需要通过重写SaveViewState()方法来实现状态保存。

  &#xff08;9&#xff09;呈现----表示向HTTP输出流中写入标记文本的过程。开发人员通过重写Render()方法使其在输出流上自定义标记文本。

  &#xff08;10&#xff09;处置----在此阶段中&#xff0c;通过重写Dispose ()方法完成释放对昂贵资源的引用&#xff0c;如数据库链接等。

  &#xff08;11&#xff09;卸载----完成的工作与"处置"阶段相同&#xff0c;但是&#xff0c;开发人员通常在Dispose()方法中执行清除&#xff0c;而不处理Unload事件



附注:在页面中动态添加子控件时候也不要放在page_load里。可以放在override oninit里面。
asp.net生命周期

一&#xff0e;预初始化对象(OnPreInit)
二&#xff0e;初始化对象(OnInit)
三&#xff0e;完成初始化(OnInitComplete)
四&#xff0e;导入Viewstate数据(LoadViewState)
五&#xff0e;用LoadPostData处理Postback数据(LoadPostData
六&#xff0e;OnPreLoad
七&#xff0e;导入对象(OnLoad)
八&#xff0e;RaisePostBackChanged事件(RaisePostDataChangedEvent)
九&#xff0e;处理客户端PostBack事件(RaisePostBackEvent)
十&#xff0e;Page_OnLoadComplete十一&#xff0e;预先呈递对象 OnPreRender
十二.完成预呈现(OnPreRenderComplete)
十三.保存ControlState(SaveControlState)



推荐阅读
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
author-avatar
君子淡如水2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有