Calendar控件编程
Programming the Calendar Control
Calendar控件提供了3个事件,它们并不是从其他控件类继承。通过为事件提供事件处理程序,可以看到日历是如何运行的。这些事件是:
l SelectionChanged
l DayRender
l VisibleMonthChanged
下面详细描述这些事件。
SelectionChanged事件
当用户在Calender控件中选择一天、一周或整个月份时,将触发SelectionChanged事件。以编程方式选择时,并不触发该事件。该事件处理程序传递一个EventArgs类型参数。
接下来的Calendar-SelectionChanged事件说明了如何处理SelectionChanged事件。当选择一个新日期时,它将显示今天的日期、选中的日期及选中的天数。
为了创建该示例,可将上一个示例Calendar-Styles复制为新网站,并命名为Calendar- SelectionChanged。在设计视图中选择Calendar控件,并双击属性窗口的事件图标(闪
电图标),为SelectionChanged事件添加具有默认名称的事件处理程序。
这样,将在内容文件的Calendar控件声明中添加一个OnSelectionChanged属性。同时,打开代码隐藏文件,代码中已经包含了事件处理程序的框架。可以在该方法框架中输入自己的代码。在Calendar1_SelectionChanged方法中输入示例5-18中高亮显示的代码,以及高亮显示的lblCountUpdate辅助方法。
示例5-18:Default.aspx.cs from Calendar-SelectionChanged
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
lblTodaysDate.Text = "Today's Date is " +
Calendar1.TodaysDate.ToShortDateString( );
if (Calendar1.SelectedDate != DateTime.MinValue)
lblSelected.Text = "The date selected is " +
Calendar1.SelectedDate.ToShortDateString( );
lblCountUpdate( );
}
private void lblCountUpdate( )
{
lblCount.Text = "Count of Days Selected: " +
Calendar1.SelectedDates.Count.ToString( );
}
}
还必须在页面的底部添加3个Label控件以便显示日历信息。示例5-19列出了内容文件,其中忽略了Calendar控件的样式属性,因为它们与上一个示例相同。从上一个示例修改的代码已经进行了高亮显示。
示例5-19:从Calendar-SelectionChanged节选的default.aspx.cs(Calendar样式属性未显示)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Calendar</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>Calendar Control</h1>
<h2>SelectionChanged</h2>
<asp:Calendar ID="Calendar1" runat="server"
OnSelectionChanged="Calendar1_SelectionChanged">
</asp:Calendar>
<br/>
<asp:Label id="lblCount" runat="server" />
<br/>
<asp:Label id="lblTodaysDate" runat="server" />
<br/>
<asp:Label id="lblSelected" runat="server" />
</div>
</form>
</body>
</html>
运行页面并选择一个日期后,将显示图5-17所示的结果。
在示例5-19中,可以看到该示例为Calendar添加了OnSelectionChanged事件处理程序。该处理程序指向代码隐藏文件中的Calendar1_SelectionChanged方法,如示例5-18所示。在Calendar控件之后添加了3个Label控件。第一个Lable控件lblCount,用于显示选择的天数。另外两个Label控件,lblTodaysDate和lblSelected,分别用于显示今天的日期和当前选定的日期。
在SelectionChanged事件处理方法中,这3个Label控件都设置了Text属性。在示例5-18中,可以看到lblTodaysDate由Calendar控件的TodaysDate属性填充,使用的代码如下所示:
lblTodaysDate.Text = "Today's Date is " +
Calendar1.TodaysDate.ToShortDateString( );
图5-17:选择日期后的Calendar-SelectionChanged
Calendar控件的ID为Calendar1,该控件的TodaysDate属性返回System.DateTime类型的值。为了给Text属性(String类型)赋值,必须把DateTime转换为String。该转换由ToShortDateString方法实现。
DateTime具有多个将DateTime对象转换为其他格式的方法,包括表5-18所显示的方法。
表5-18 DateTime转换到字符串的方法
| 方法名称 | 说 明 |
| ToFileTime | 转换到本地文件系统的格式 |
| ToLongDateString | 转换到长日期字符串 |
| ToLongTimeString | 转换到长时间字符串 |
| ToShortTimeString | 转换到短时间字符串 |
| ToString | 转换到一个字符串 |
尽管不是ASP.NET特有的,DateTime对于获取日期和时间信息是非常有用的。该结构的一些只读属性在表5-19中列出。
表5-19 DateTime的只读属性
| 属性名称 | 类 型 | 说 明 |
| Date | DateTime | 返回日期部分 |
| Day | Integer | 返回月份中的日期 |
| DayOfWeek | DayOfWeek | 返回一周中的日期,如Friday,Saturday等 |
| DayOfYear | Integer | 返回年份中的日期 |
| Hour | Integer | 返回小时部分 |
| Millisecond | Integer | 返回毫秒部分 |
| Minute | Integer | 返回分钟部分 |
| Month | Integer | 返回月部分 |
| Second | Integer | 返回秒部分 |
| Ticks | Long | 返回表示日期和时间的以100毫微秒为间隔的间隔数 |
| TimeOfDay | TimeSpan | 返回当天的时间 |
| Year | Integer | 返回年部分 |
lblSelected由下面的代码填充:
if (Calendar1.SelectedDate != DateTime.MinValue)
lblSelected.Text = "The date selected is " +
Calendar1.SelectedDate.ToShortDateString( );
为了检查是否选择一日期,可以检测当前选择日期Calendar1.SelectedDate是否等于DateTime.MinValue。DateTime.MinValue是一个表示DateTime最小可能值的常量。如果没有选择一个日期SelectedDate属性,则默认为DateTime.MinValue。MinValue的值为12:00:00 AM,
如果用户选择了一个日期,lblSelected的Text属性将被设置为SelectedDate属性值的字符串。
Label控件lblCount显示选择的天数。SelectionChanged事件处理程序调用lblCountUpdate方法,该方法设置lblCount的Text属性。为设置该控件,必须确定选择了多少个日期。Calendar控件有一个SelectedDates属性,它返回一个SelectedDates集合。SelectedDates集合是一个表示Calendar控件所有选定的DateTime对象的集合。Count是SelectedDatesCollection对象的一个属性,它返回一个包含集合中日期数量
的整型值。由于Count属性是一个整型值,所以必须使用ToString方法把它转换为一个字符串,才可以给Text属性赋值。
Calendar1.SelectedDates.Count.ToString( )
尽管SelectedDates(选定日期的集合)和SelectedDate(单个选定的日期)都包含DateTime对象,但只存储Date值,时间值被设置null(在C#语言中)。
SelectedDates集合中的日期是按日期升序排列的。更新SelectedDates集合时,SelectedDate属性自动更新为包含SelectedDates集合的第一个对象。
用户单击月份标题两边的月份导航控件会在月份之间导航。用户也可以单击一天以选中它,单击星期选择控件选定一个星期,单击月份选择控件选中整个月份。
然而,可以给用户更多的灵活性。为此,必须添加几个控件和方法。将当前示例Calendar-SelectionChanged复制到一个新网站,并命名为Calendar-MoreSelections。
为使用户可以直接导航到一年中的任意月份,可添加一个包含一年中所有月份的DropDownList和一个标签为TGIF的按钮,该按钮选中当前显示月份所有的星期5。
Calendar控件还可以让用户选择一定范围内的日期。您可能希望用户可以使用标准的Windows方法,按住Ctrl或Shift键选择日期的,但这样不行。不过在页面上放几个控件用于选定开始日期和结束日期。在Calendar-MoreSelections中,将添加两个TextBox控件用于输入一定范围内的开始日期和结束日期,以及一个Button控件来强制选择该范围内的日期。
实现该功能的内容文件在示例5-20中列出。同样,为了简洁,所有与Calendar的样式相关的属性都被省略,它们与5-17示例中的相同。从上一个示例修改的代码(它们表示添加的控件)被高亮显示。
示例5-20:Calendar-MoreSelections的Default.aspx,省略Calendar的样式属性
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Calendar</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>Calendar Control</h1>
<h2>More Selections</h2>
<asp:Calendar ID="Calendar1" runat="server"
OnSelectionChanged="Calendar1_SelectionChanged">
</asp:Calendar>
<br/>
<asp:Label id="lblCount" runat="server" />
<br/>
<asp:Label id="lblTodaysDate" runat="server" />
<br/>
<asp:Label id="lblSelected" runat="server" />
<br/>
<table>
<tr>
<td>
Select a month:
</td>
<td>
<asp:DropDownList id= "ddl" runat="server"
AutoPostBack="true"
onSelectedIndexChanged = "ddl_SelectedIndexChanged">
<asp:ListItem text="January" value="1" />
<asp:ListItem text="February" value="2" />
<asp:ListItem text="March" value="3" />
<asp:ListItem text="April" value="4" />
<asp:ListItem text="May" value="5" />
<asp:ListItem text="June" value="6" />
<asp:ListItem text="July" value="7" />
<asp:ListItem text="August" value="8" />
<asp:ListItem text="September" value="9" />
<asp:ListItem text="October" value="10" />
<asp:ListItem text="November" value="11" />
<asp:ListItem text="December" value="12" />
</asp:DropDownList>
</td>
<td>
<asp:Button id="btnTgif" runat="server"
text="TGIF"
onClick="btnTgif_Click"/>
</td>
</tr>
<tr>
<td colspan="2"> </td>
</tr>
<tr>
<td colspan="2"><b>Day Range</b></td>
</tr>
<tr>
<td>Starting Day</td>
<td>Ending Day</td>
</tr>
<tr>
<td>
<asp:TextBox id= "txtStart" runat="server"
Width="25"
MaxLength="2" />
</td>
<td>
<asp:TextBox id= "txtEnd" runat="server"
Width="25"
MaxLength="2" />
</td>
<td>
<asp:Button id="btnRange" runat="server"
text="Apply"
onClick="btnRange_Click" />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
示例5-21列出了该示例完整的代码隐藏文件。从上一个示例中修改的代码被高亮显示。
示例5-21:Calendar-MoreSelections的Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;