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

新建网站后创建一个名为AdvancedCalendarExtender.ascx的用户控件,封装三个TextBox、一个ImageButton和CalendarExtender,其中ImageButton用于弹出日历:

AdvancedCalendarExtender.ascx

1>

注意CalendarExtender的Format设置成了yyyy/MM/dd,格式在此处不是特别重要,但为了后面的便利,最好设置成带“/”或“-”这类分隔符的格式。另外TargetControlID设置成了txtYear,作为默认的方式,控件运行的时候会将完整的日期填进第一个仅仅只用于显示年份的文本框。

CalendarExtender只有几个基本的服务器端事件,并未提供更为合适的事件来帮助我们解决问题。但我们可以使用服务器端的属性映射到客户端,再用客户端的JavaScript来操作文本框。查看属性列表,刚好有个OnClientDateSelectionChanged属性可供我们使用,现在,设置OnClientDateSelectionChanged属性,用JavaScript编写select()函数:

AdvancedCalendarExtender.ascx

 1>

 JavaScript的select()函数通过$get()方法来获取文本框中的日期。这里要注意的是,文本框因为用在用户控件里,它在客户端浏览器里所对应<input>的ID不再是服务器上的txtYear,而是“用户控件ID_文本框ID”的格式。因此我们通过<%= %>来输出用户控件将来在客户端的ID。只要了解这点,剩下的select()函数的逻辑就很简单了:获取第一个文本框中完整的日期,使用split()方法按“/”切割(这就是之前为什么用yyyy/MM/dd格式),切割后得到数组,把数组里的内容分别填到三个文本框里。完成后,将AdvancedCalendarExtender.ascx添加到页面中,运行后效果如下图所示:

扩展CalendarExtender的应用场合

AdvancedCalendarExtender已经可以正常工作了!但别忙着高兴,试试在同一个页面中,将该用户控件使用两次,得到了什么效果?

扩展CalendarExtender的应用场合

当你从第一个日历中选中日期后,会看到如上图所示的效果。原因就是两个用户控件会把同名的select()函数生成两遍!我们让这两个select()不同名就可以了。下面将用户控件改成:

AdvancedCalendarExtender.ascx

 1>

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

AdvancedCalendarExtender.ascx.cs

1扩展CalendarExtender的应用场合protected void Page_Load(object sender, EventArgs e)
2}

这样在同一个页面中多次使用AdvancedCalendarExtender就没问题了!还可以为AdvancedCalendarExtender封装年份、月份和日期属性,方便日后在页面中使用。

最终运行效果如下图所示:

扩展CalendarExtender的应用场合

最后给出AdvancedCalendarExtender.ascx和测试页面的完整代码:

AdvancedCalendarExtender.ascx

 1>

AdvancedCalendarExtender.ascx.cs

 1扩展CalendarExtender的应用场合using System;
 2扩展CalendarExtender的应用场合using System.Collections.Generic;
 3扩展CalendarExtender的应用场合using System.Linq;
 4扩展CalendarExtender的应用场合using System.Web;
 5扩展CalendarExtender的应用场合using System.Web.UI;
 6扩展CalendarExtender的应用场合using System.Web.UI.WebControls;
 7扩展CalendarExtender的应用场合
 8扩展CalendarExtender的应用场合public partial class AdvancedCalendarExtender : System.Web.UI.UserControl
 9}

Default.aspx

 1>

Default.aspx.cs

 1扩展CalendarExtender的应用场合using System;
 2扩展CalendarExtender的应用场合using System.Collections.Generic;
 3扩展CalendarExtender的应用场合using System.Linq;
 4扩展CalendarExtender的应用场合using System.Web;
 5扩展CalendarExtender的应用场合using System.Web.UI;
 6扩展CalendarExtender的应用场合using System.Web.UI.WebControls;
 7扩展CalendarExtender的应用场合
 8扩展CalendarExtender的应用场合public partial class _Default : System.Web.UI.Page 
 9}

 

Enjoy!

相关文章:

  • 2021-11-14
  • 2021-06-19
  • 2021-12-11
  • 2021-07-20
  • 2022-12-23
  • 2021-07-18
  • 2021-08-10
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-04-29
  • 2022-12-23
  • 2022-12-23
  • 2022-01-26
  • 2022-12-23
相关资源
相似解决方案