韩言福地

只有想不到的,没有办不到的。 - HY Auspicious Place

« Calendar更容易控制样式的方法,和布局ASP.NET高级控件——Calendar 控件编程之二 »

ASP.NET高级控件——Calendar 控件编程之一

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-18Default.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(  );

   }

}

还必须在页面的底部添加3Label控件以便显示日历信息。示例5-19列出了内容文件,其中忽略了Calendar控件的样式属性,因为它们与上一个示例相同。从上一个示例修改的代码已经进行了高亮显示。


示例5-19:从Calendar-SelectionChanged节选的default.aspx.csCalendar样式属性未显示)

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs"

   Inherits="_Default" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"

   "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控件之后添加了3Label控件。第一个Lable控件lblCount,用于显示选择的天数。另外两个Label控件,lblTodaysDatelblSelected,分别用于显示今天的日期和当前选定的日期。

SelectionChanged事件处理方法中,这3Label控件都设置了Text属性。在示例5-18中,可以看到lblTodaysDateCalendar控件的TodaysDate属性填充,使用的代码如下所示:

lblTodaysDate.Text = "Today's Date is " +

   Calendar1.TodaysDate.ToShortDateString(  );


 

5-17:选择日期后的Calendar-SelectionChanged

Calendar控件的IDCalendar1,该控件的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

返回一周中的日期,如FridaySaturday

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.MinValueDateTime.MinValue是一个表示DateTime最小可能值的常量。如果没有选择一个日期SelectedDate属性,则默认为DateTime.MinValueMinValue的值为12:00:00 AM1/1/0001 CE,还有一个MaxValue字段,它的值为11:59:59 PM12/31/9999 CE

提示:CECommon Era的缩写,它是表示到公历元年的时间间隔的科学符号。BCEBCBefor Christ)的科学表示。

如果用户选择了一个日期,lblSelectedText属性将被设置为SelectedDate属性值的字符串。

Label控件lblCount显示选择的天数。SelectionChanged事件处理程序调用lblCountUpdate方法,该方法设置lblCountText属性。为设置该控件,必须确定选择了多少个日期。Calendar控件有一个SelectedDates属性,它返回一个SelectedDates集合。SelectedDates集合是一个表示Calendar控件所有选定的DateTime对象的集合。CountSelectedDatesCollection对象的一个属性,它返回一个包含集合中日期数量


的整型值。由于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方法,按住CtrlShift键选择日期的,但这样不行。不过在页面上放几个控件用于选定开始日期和结束日期。在Calendar-MoreSelections中,将添加两个TextBox控件用于输入一定范围内的开始日期和结束日期,以及一个Button控件来强制选择该范围内的日期。

实现该功能的内容文件在示例5-20中列出。同样,为了简洁,所有与Calendar的样式相关的属性都被省略,它们与5-17示例中的相同。从上一个示例修改的代码(它们表示添加的控件)被高亮显示。

示例5-20Calendar-MoreSelectionsDefault.aspx,省略Calendar的样式属性

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs"

   Inherits="_Default" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"

   "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">&nbsp;</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-21Calendar-MoreSelectionsDefault.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;