扩展CalendarExtender的应用场合
ASP.NET AJAX Control Toolkit中的CalendarExtender在用于选择日期的时候已经非常方便,网上也有很多Tips来解决语言是英语、显示不正常等问题。但该控件默认只和一个文本框配合使用(通过TargetControlID属性),也就是会将完整的日期填到一个文本框中。如果碰到了需要将年份、月份和日期分别显示到三个文本框的场合,该怎么办呢?本文来解决这个问题!
新建网站后创建一个名为AdvancedCalendarExtender.ascx的用户控件,封装三个TextBox、一个ImageButton和CalendarExtender,其中ImageButton用于弹出日历:
AdvancedCalendarExtender.ascx

2

3

4

5

6

注意CalendarExtender的Format设置成了yyyy/MM/dd,格式在此处不是特别重要,但为了后面的便利,最好设置成带“/”或“-”这类分隔符的格式。另外TargetControlID设置成了txtYear,作为默认的方式,控件运行的时候会将完整的日期填进第一个仅仅只用于显示年份的文本框。
CalendarExtender只有几个基本的服务器端事件,并未提供更为合适的事件来帮助我们解决问题。但我们可以使用服务器端的属性映射到客户端,再用客户端的JavaScript来操作文本框。查看属性列表,刚好有个OnClientDateSelectionChanged属性可供我们使用,现在,设置OnClientDateSelectionChanged属性,用JavaScript编写select()函数:
AdvancedCalendarExtender.ascx

2

3

4

5

6

7

8

9

10

11

12

13

14

15

JavaScript的select()函数通过$get()方法来获取文本框中的日期。这里要注意的是,文本框因为用在用户控件里,它在客户端浏览器里所对应<input>的ID不再是服务器上的txtYear,而是“用户控件ID_文本框ID”的格式。因此我们通过<%= %>来输出用户控件将来在客户端的ID。只要了解这点,剩下的select()函数的逻辑就很简单了:获取第一个文本框中完整的日期,使用split()方法按“/”切割(这就是之前为什么用yyyy/MM/dd格式),切割后得到数组,把数组里的内容分别填到三个文本框里。完成后,将AdvancedCalendarExtender.ascx添加到页面中,运行后效果如下图所示:
AdvancedCalendarExtender已经可以正常工作了!但别忙着高兴,试试在同一个页面中,将该用户控件使用两次,得到了什么效果?
当你从第一个日历中选中日期后,会看到如上图所示的效果。原因就是两个用户控件会把同名的select()函数生成两遍!我们让这两个select()不同名就可以了。下面将用户控件改成:
AdvancedCalendarExtender.ascx

2

3

4

5

6

7

8

9

10

11

12

13

14

15

注意:1、JavaScript函数名的写法;2、因为将来JavaScript函数名不固定,所以我们无法直接在声明语句中静态设置OnClientDateSelectionChanged属性。我们打开AdvancedCalendarExtender.ascx.cs,在Page_Load()方法里面动态的设置OnClientDateSelectionChanged属性:
AdvancedCalendarExtender.ascx.cs

2

3

4

这样在同一个页面中多次使用AdvancedCalendarExtender就没问题了!还可以为AdvancedCalendarExtender封装年份、月份和日期属性,方便日后在页面中使用。
最终运行效果如下图所示:
最后给出AdvancedCalendarExtender.ascx和测试页面的完整代码:
AdvancedCalendarExtender.ascx

2

3

4

5

6

7

8

9

10

11

12

13

14

15

AdvancedCalendarExtender.ascx.cs

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

Default.aspx

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Default.aspx.cs

2

3

4

5

6

7

8

9

10

11

12

13

14

Enjoy!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?