热门标签 | 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)



推荐阅读
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 在本教程中,我们将深入探讨如何使用 Python 构建游戏的主程序模块。通过逐步实现各个关键组件,最终完成一个功能完善的游戏界面。 ... [详细]
  • 本文详细介绍了如何在 MySQL 中授予和撤销用户权限。包括创建用户、赋予不同级别的权限(如表级、数据库级、服务器级)、使权限生效、查看用户权限以及撤销权限的方法。此外,还提供了常见错误及其解决方法。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 黑马头条项目:Vue 文章详情模块与交互功能实现
    本文详细介绍了如何在黑马头条项目中配置文章详情模块的路由、获取和展示文章详情数据,以及实现关注、点赞、不喜欢和评论功能。通过这些步骤,您可以全面了解如何开发一个完整的前端文章详情页面。 ... [详细]
  • 当unique验证运到图片上传时
    2019独角兽企业重金招聘Python工程师标准model:public$imageFile;publicfunctionrules(){return[[[na ... [详细]
  • 一个登陆界面
    预览截图html部分123456789101112用户登入1314邮箱名称邮箱为空15密码密码为空16登 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 方法:1 配置数据库basediros.path.abspath(os.path.dirname(__file__))  #获取当前文件的绝对路径appFlask(__name__ ... [详细]
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社区 版权所有