社区编辑申请
注册/登录
ASP.NET源码之自定义控件DateTimePicker
开发 后端
ASP.NET源码之自定义控件DateTimePicker是什么情况呢?这篇文章将会向你介绍ASP.NET源码之自定义控件DateTimePicker的具体情况。

ASP.NET源码之自定义控件DateTimePicker的介绍:写在前面:要实现DateTimePicker功能,最简单的就是一个input,旁边有一个日历的小图标,加入大量的javascript代码,然后,点击日历后,就出现一个div用来选择日期,选定之后,input就会出现刚才选定的日期。而input应该是只读的。

ASP.NET源码之自定义控件DateTimePicker效果图

日期效果图 

标记

Register Assembly="DateTimePickerControls" Namespace="DateTimePickerControls" TagPrefix="DTP"
这是写在aspx页上面的,用于引用dll的资源。

对应于源代码中的命名空间的属性定义

[assembly: TagPrefix("DateTimePickerControls", "DTP")]

加入工具箱

可以使用下面的方法将自定义的ASP.NET控件加入到工具箱中,如果引入DLL之后,工具箱还不出现控件,可以在工具箱右击,选择项,然后选择DLL就一定可以。下面的ToolboxData表现控件的名称,而Designer表示控件在设计界面(DesignMode)中的样子,注意,必须存在DateTimePickerControls.DateTimePickerDesigner这个类才出现这句话。而DescriptionAttribute则是描述控件的作用。

  1. [  
  2.   ToolboxData("<{0}:DateTimePicker runat=server></{0}:DateTimePicker>"),  
  3.   ValidationPropertyAttribute("Text"),  
  4.   Designer(typeof(DateTimePickerControls.DateTimePickerDesigner)),  
  5.   DescriptionAttribute("一个基于 MSHTML 的 ASP.NET 时间选择器。")  
  6.   ] 

控件DateTimePicker 

继承

public class DateTimePicker: Control, IPostBackDataHandler, INamingContainer, IPostBackEventHandler

Control 是System.Web.UI空间下面的Control,表现Web控件的类,而IPostBackDataHandler是定义 ASP.NET 服务器控件为自动加载回发数据而必须实现的方法。也就是,使用_Control.Tex而不是Request.QueryString[“…”]. ToString()或Request.Form[“…”].ToString(),来获取Html中的数据,主要的方法是LoadPostData, RaisePostDataChangedEvent,而INamingContainer和IPostBackEventHandler则暂时没怎么使用。笔者只是参考其它Web控件而把这两个接口加上去。

注册脚本

注意到每一个Web自定义控件,都有其对应的Javascript或Vbscript脚本,而且,当页面上有多个这样的控件。不应用出现多个相同脚本。

所以,要使用Page.ClientScript.IsClientScriptBlockRegistered方法来注册脚本。这样的注册脚本,相当于有一个Hashtable来保存脚本,而每一个注入的脚本都有一个Key来关联。这样的好处是,在使用多个脚本时,不会重复地写在页面上。

下面的代码,使用到资源文件中写好的脚本文件,换句话说,可以将脚本文件,如Javascript或Vbscript脚本先写好,然后,直接复制到

  1. if (!Page.ClientScript.IsClientScriptBlockRegistered("DateTimePickerBaseScript"))  
  2. {  
  3.     ResourceManager manager = new ResourceManager(this.GetType());  
  4.     string script = manager.GetResourceSet(  
  5.         System.Globalization.CultureInfo.CurrentCulture, truetrue).GetString("DateTimePickerBaseScript");  
  6.     Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "DateTimePickerBaseScript", script);  

而.resx文件的源代码,可以是这样的:

  1. <root>  
  2. <!--其它的资源-->  
  3. <data name="DateTimePickerBaseScript">  
  4. <![CDATA[  
  5. Javascript或VbScript  
  6. ]]>  
  7. </data>  
  8. </root> 

在资源文件中写脚本的优点是十分的明显的,也就是.js的内容可以直接复制并粘贴到这里,而不用再经过处理。

ASP.NET源码之自定义控件DateTimePicker重写Control继承而来的方法

protected override void OnPreRender(EventArgs e)

protected override void CreateChildControls()

可以将OnPreRender方法当成普通Page的OnLoad方法使用,而CreateChildControls方法用于新建子控件,也就是构造自定义控件的主要代码。

获取Text属性

  1.    public bool LoadPostData(String postDataKey, NameValueCollection values)  
  2.    {  
  3. string PresentValue = this.ViewStateText;  
  4. string PostedValue = values[base.ID];  
  5. if (!PresentValue.Equals(PostedValue))  
  6. {  
  7.     this.Text = PostedValue;  
  8.     return true;  
  9. }  
  10. else 
  11. {  
  12.     return false;  
  13. }  
  14.    } 

上面是使用LoadPostData方法来获取Text属性的值。注意,这个方法有时候是不运行的,这是因为你的ChildControls中没有一个ID =base.ID的控件,则,必须有一个子控件的ID为本控件的ID,这里讲的子控件,不是指System.Web.UI空间下面的控件,而是指代那些可以在客户端的浏览器中显示的<input id=””>形式的控件,也就是使用string来表达的。正如

WriteTimePicker方法中写到的"<input type=\"text\" id=\"" + DateTimePickerID。

获取FormID

可以使用一个遍历的过程,获取项层控件的ClientID,因为在Js脚本中,服务器端的ID是用不了的。

设置DesignMode属性类

也就是前面所提及的Designer(typeof (DateTimePickerControls.DateTimePickerDesigner)),相对来说,是比较简单的,可以说,你可以参照一个正确的例子,然后随便修改一下就可以。需要继承System.Web.UI.Design.ControlDesigner类,重写方法 Initialize,GetDesignTimeHtml。而GetDesignTimeHtml就是***显示在设计界面上面的样子。

显示效果图 

设计代码如下:

  1. StringWriter sw = new StringWriter();  
  2.  
  3. HtmlTextWriter htw = new HtmlTextWriter(sw);  
  4. HtmlInputText inputText = new HtmlInputText();  
  5. inputText.Value = dtp.ID;  
  6. inputText.Style.Value = "Width:100px;border-style: none;background-color: #9EBEF5";             
  7. inputText.RenderControl(htw);  
  8. return sw.ToString(); 

综上述得,要定义一个比较好的自定义控件,首先要有一个非控件形式的“功能点”使用方法,即上述的时间选择功能,要JSP,ASP,ASP.NET中都可以使用的。然后,根据ASP.NET自定义控件的语法,一步步翻译就没什么问题了。

ASP.NET源码之自定义控件DateTimePicker的情况就介绍到这里,希望对你了解ASP.NET源码之自定义控件DateTimePicker有所帮助。

【编辑推荐】

  1. ASP.NET Request对象使用实例浅析
  2. ASP.NET(VB)应用之图片增加水印文字浅析
  3. ASP.NET页面框架概念浅析
  4. ASP.NET项目开发中健康监视浅析
  5. ASP.NET数据库缓存浅析
责任编辑:仲衡 来源: cnblogs
相关推荐

2009-08-06 09:18:01

ASP.NET自定义控ASP.NET控件开发

2009-08-06 17:13:56

ASP.NET自定义控

2009-08-10 14:16:59

2011-04-19 10:33:16

ASP.NET自定义控

2009-09-03 13:34:03

.NET自定义控件

2009-08-07 14:05:21

ASP.NET控件

2009-08-10 14:08:15

ASP.NET服务器控ASP.NET组件设计

2009-08-07 15:34:15

ASP.NET数据绑定

2009-08-04 15:20:59

ASP.NET数据验证数据验证控件

2009-08-07 10:34:56

2009-08-04 13:39:43

2009-08-06 13:08:23

ASP.NET控件开发

2009-08-06 18:18:27

2009-08-07 14:42:02

ASP.NET控件开发

2009-07-28 09:46:53

ASP.NET服务器控

2009-08-07 17:49:44

控件设计器

2009-09-09 22:53:34

ASP.NET 时间控

2009-07-24 09:57:25

ASP.NET HTM

2009-07-24 15:46:00

ASP.NET登陆控件

2009-08-05 15:57:03

ASP.NET控件ID

同话题下的热门内容

太强了!Python 开发桌面小工具,让代码替我们干重复的工作!Python轻量级Web框架:Bottle库!Python居然被用来开发游戏了?盘点你想不到的Python开发场景用了那么久的Lombok,你知道它的原理么?实战 | 如何用 Python 自动化监控文件夹完成服务部署!Fury:一个基于JIT动态编译的高性能多语言原生序列化框架细思恐极,插上U盘就开始执行Python代码太全了!用Python操作MySQL的使用教程集锦!

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号