Calendar控件的使用

Calendar控件的使用

Calendar控件的使用,主要有四件事情:Calendar控件的选择模式,获取选中的日期,设置需要选中的日期,为特定日期设置额外信息,如节日。

一、Calendar控件的选择模式:

     用DropDownList来实现:

  1. Calendar的选择模式:"DropDownList1" runat="server" 
  2.             AutoPostBack="True" onselectedindexchanged="DropDownList1_SelectedIndexChanged">
  3.             "None">不选择
  4.             "Day">天
  5.             "DayWeek">天、周
  6.             "DayWeekMonth">天、周、月
  7.         

 

注意其AutoPostBack属性设置为Ture,然后,用DropDownList_SelectedIndexChanged事件实现选择模式:如下:

  1.         protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
  2.         {
  3.             switch (DropDownList1.SelectedValue)
  4.             {
  5.                 case "None":
  6.                     Calendar1.SelectionMode = CalendarSelectionMode.None;
  7.                     break;
  8.                 case "DayWeekMonth":
  9.                     Calendar1.SelectionMode = CalendarSelectionMode.DayWeekMonth;
  10.                     break;
  11.                 case "DayWeek":
  12.                     Calendar1.SelectionMode = CalendarSelectionMode.DayWeek;
  13.                     break;
  14.                 case "Day":
  15.                     Calendar1.SelectionMode = CalendarSelectionMode.Day;
  16.                     break;
  17.             }
  18.         }

 

二、获取选中的日期,这个主要是Calendar控件首先要是可选择的,也即是其属性SelectionMode要设置成Day,或Day,或DayWeekMonth。当设置成后边两种的时候,选中的日期是周或月的第一天。然后应用Calendar_SelectionChanged事件。如下:

  1.         获取选中的日期
  2.         当前选中的日期是:"Label1" runat="server">
  3.         
  4.         当前的天是:"Label2" runat="server">
  5.         
  6.         当前的月是:"Label3" runat="server">
  7.         
  8.         当前的年是:"Label4" runat="server">
  9.         

 

  1.         protected void Calendar1_SelectionChanged(object sender, EventArgs e)
  2.         {
  3.             Label1.Text = Calendar1.SelectedDate.ToShortDateString();
  4.             Label2.Text = Calendar1.SelectedDate.Day.ToString();
  5.             Label3.Text = Calendar1.SelectedDate.Month.ToString();
  6.             Label4.Text = Calendar1.SelectedDate.Year.ToString();
  7.         }

 

三、设置Calendar控件的显示时间

    这个很简单,就是利用给Calendar的VisibleDate成员赋值就可以了,当然,先得想法表示要设置的日期,用多个DropDownList,如下:

  1.         设置日期:
  2.         "DropDownListYear" runat="server" AutoPostBack="True" 
  3.             onselectedindexchanged="DropDownListYear_SelectedIndexChanged">
  4.         
  5.         年"DropDownListMonth" runat="server" AutoPostBack="True" 
  6.             onselectedindexchanged="DropDownListMonth_SelectedIndexChanged">
  7.         
  8.         月"DropDownListDay" runat="server" AutoPostBack="True" 
  9.             onselectedindexchanged="DropDownListDay_SelectedIndexChanged">
  10.         
  11.         日"Button1" runat="server" οnclick="Button1_Click" Text="设置" />

然后需要填充这三个DropDownList,在Paged_Init函数中填充,如下:

  1.             //填充三个DropDownList
  2.             for (int y = 1980; y <= 2050; y++)
  3.             {
  4.                 DropDownListYear.Items.Add(y.ToString());
  5.             }
  6.             for (int m = 1; m <= 12; m++)
  7.             {
  8.                 DropDownListMonth.Items.Add(m.ToString());
  9.             }
  10.             for (int d = 1; d <= 31; d++)
  11.             {
  12.                 DropDownListDay.Items.Add(d.ToString());
  13.             }

这样填充,问题出现了,就是每个月都有31天,于是要根据月份的不同来填充天数,如果将三个DropDownList的AutoPostBack属性都设置成True,做成级联的DropDownList。如下:

  1.         protected void DropDownListYear_SelectedIndexChanged(object sender, EventArgs e)
  2.         {//这个函数要了后,级联菜单显得真实
  3.             DropDownListMonth.Items.Clear();
  4.             for (int m = 1; m <= 12; m++)
  5.             {
  6.                 DropDownListMonth.Items.Add(m.ToString());
  7.             }
  8.         }
  9.         protected void DropDownListMonth_SelectedIndexChanged(object sender, EventArgs e)
  10.         {//解决了28天,30天,31天的问题
  11.             DropDownListDay.Items.Clear();
  12.             int month = Convert.ToInt32(((DropDownList)sender).SelectedValue);
  13.             if (month <= 7 && month % 2 == 1 ||
  14.                 month >= 8 && month % 2 == 0)
  15.             {
  16.                 for (int d = 1; d <= 31; d++)
  17.                 {
  18.                     DropDownListDay.Items.Add(d.ToString());
  19.                 }
  20.             }
  21.             else if (month == 2)
  22.             {
  23.                 for (int d = 1; d <= 28; d++)
  24.                 {
  25.                     DropDownListDay.Items.Add(d.ToString());
  26.                 }
  27.             }
  28.             else
  29.             {
  30.                 for (int d = 1; d <= 30; d++)
  31.                 {
  32.                     DropDownListDay.Items.Add(d.ToString());
  33.                 }
  34.             }
  35.         }
  36.         protected void DropDownListDay_SelectedIndexChanged(object sender, EventArgs e)
  37.         {
  38.             //实际上,可以在这个函数里边做Calendar的日期设置工作
  39.         }

其实,设定的工作,完全可以在第三个DropDownList的SelectedIndexChanged事件中来做,但是这里用按钮来做:

  1.         protected void Button1_Click(object sender, EventArgs e)
  2.         {
  3.             //设置日期
  4.             string y = DropDownListYear.SelectedValue.ToString();
  5.             string m = DropDownListMonth.SelectedValue.ToString();
  6.             string d = DropDownListDay.SelectedValue.ToString();
  7.             Calendar1.VisibleDate = Convert.ToDateTime(y + "-" + m + "-" + d);
  8.         }

四、为Calendar加额外信息:

    为Calendar加额外信息,需要在Calendar控件初始化完成,但还没有呈现的时候来做,所以,用其DayRender事件,但事先,需要用数组将要加的信息准备好,放在Paged_Init函数中:

  1.             private string[][] arr;
  2.             //初始化日历控件中的节日
  3.               arr = new string[13][];
  4.             for (int i = 1; i < 13; i++)
  5.             {
  6.                 arr[i] = new string[32];
  7.             }
  8.             arr[1][1] = "元旦节";
  9.             arr[1][15] = "元宵节";
  10.             arr[2][14] = "情人节";
  11.             arr[3][8] = "妇女节";
  12.             arr[4][15] = "外国节";
  13.             arr[5][1] = "劳动节";
  14.             arr[5][5] = "端午节";
  15.             arr[6][1] = "儿童节";
  16.             arr[6][23] = "我的生日";
  17.             arr[7][1] = "党的生日";
  18.             arr[7][7] = "七夕节";
  19.             arr[7][15] = "她的生日";
  20.             arr[8][1] = "建军节";
  21.             arr[9][10] = "教师节";
  22.             arr[10][1] = "国庆节";
  23.             arr[11][15] = "没有节";
  24.             arr[12][25] = "圣诞节";

然后,在DayRend事件中,根据数组所表示的所在月和天的信息是否为空,将信息设置好:

  1.         protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
  2.         {//初始化后,呈现之前激发
  3.             CalendarDay d = e.Day;
  4.             TableCell c = e.Cell;
  5.             if (d.IsOtherMonth)
  6.             {
  7.                 c.Controls.Clear();
  8.             }
  9.             else
  10.             {
  11.                 try
  12.                 {
  13.                     string txt = arr[d.Date.Month][d.Date.Day];
  14.                     if (txt != String.Empty)
  15.                     {
  16.                         string day = d.Date.ToShortDateString();
  17.                         c.Controls.Add(new LiteralControl("
     + day + "'>" + txt + ""
    ));
  18.                         //c.Controls.Add(new LiteralControl("
    " + txt));
  19.                     }
  20.                 }
  21.                 catch (System.Exception ex)
  22.                 {
  23.                     Response.Write(ex.ToString());
  24.                 }
  25.             }
  26.         }

    使用这个方式,需要设置的超级连接的时间完全可以从数据库中读出来,在做文章管理的时候,按时期管理非常的方便,即通过保存在数据库中每篇文章的发表日期,由Calendar连接到相应日期,然后对所有在这个日期发表的文章进行管理。

你可能感兴趣的:(AspDotNet)