Calendar日历控件:
1. MSDN中的概述:
Calendar Web 服务器控件在 ASP.NET 网页中显示一个单月份日历。用户可使用该日历查看和选择日期。
可以使用 Calendar Web 服务器控件执行下面的操作:
(1) 显示和选择日期:该控件显示一个日历,用户通过此日历可定位到任意一年中的任意一天。设置 SelectedDate 属性,使某个特定的日期在控件中突出显示。用户还可通过单击一个日或在不同的月份之间移动以移动到任意日期。还可配置日历模式以允许用户选择多个日期,包括整周或整月:
模式 |
描述 |
Day |
用户只能选择一天 |
DayWeek |
用户可以选择一天或者一周
|
DayWeekMonth |
用户可选择一天、一周或者一个月 |
None |
用户不能选择
|
Calendar1.SelectionMode = CalendarSelectionMode.Day
(2) 在日历网格中显示自定义约会、纪念日或其他特别信息 Calendar 控件可为个别日显示该日特定的详细信息,如一份事务列表、一份事件时间表或类似的信息。该功能允许您显示数据库中的日信息。 通过对Calendar控件的DayRander事件进行编成,可以在显示日期的时候轻松显示自定义的节日。具体方法将在稍后介绍。
2.
如何:在 Calendar 控件中显示数据库中的选定日期:
Calendar 控件并不直接支持数据绑定,也就是说,您不能像AdRotater控件那样将日历控件作为一个整体绑定到数据源。相反,您需要编写代码来获取所需数据,然后就可以在 DayRender 事件中,将当前呈现的日期与从数据源读取的数据进行比较。
(1) 建立数据表(名称:Calendar):
列名称 |
数据类型 |
说明 |
ID
|
int
|
这是主键。此列可给定任何名称。
|
HolidayDay
|
datetime
|
保存自定义的特殊日期。
|
Holiday
|
nvarchar(length)
|
保存自定义特殊日期的现实文本。
|
在表中插入数据。
(2) 因为Calendar控件无法直接绑定到数据源所以需要建立数据集(DataSet),名称为Test。其中加入数据适配器(TableAdapter)。
SELECT HolidayDate, Holiday
FROM Calender
WHERE (HolidayDate >= @firstDay) AND (HolidayDate < @lastDay)
将该查询方法名称设置为GetHol。该步完成后系统将自动生成表对象(Calendar)和查询方法(GetHol)。
(3) 在网页设计页面简单放置一个Calendar控件,在控件的时间列表里分别制定它的VisibleMonthChanged、DayRender方法名。
(4) 在页面后端代码(.cs)文件中为Calendar控件编写添加特殊日期的方法和配套方法。
完成代码如下:
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;
using TestTableAdapters;//引入数据适配器!
public partial class _Default : System.Web.UI.Page
{
//分别声明页面级的表对象和适配器对象。
Test.CalenderDataTable tempTable = new Test.CalenderDataTable();
CalenderTableAdapter calAdapter = new CalenderTableAdapter();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
/**//*VisibleDate:
* 此属性确定日历中显示哪个月份。
* 在日历中,用户可在不同的月份之间移动,从而在不影响当前日期的情况下更改可视日期。
* 通过以编程方式设置可视日期,可定位到不同的月份。*/
Calendar1.VisibleDate = DateTime.Today;//设置日历显示今天所在月份。
//该方法从数据库检索数据填充入数据访问层的Calendar表中。
FillHolidayTable();
}
}
protected void FillHolidayTable()
{
//设置数据访问层从数据库搜索特殊日期的开始和截止时间。这里设置为当前月的一号到下月的一号。
DateTime firstDate = new DateTime(Calendar1.VisibleDate.Year, Calendar1.VisibleDate.Month, 1);
DateTime lastDate = GetFirstDayOfNextMonth();
tempTable = calAdapter.GetHol(firstDate, lastDate);
}
//返回下一月的第一天。
protected DateTime GetFirstDayOfNextMonth()
{
int monthNumber, yearNumber;
if (Calendar1.VisibleDate.Month == 12)
{
monthNumber = 1;
yearNumber = Calendar1.VisibleDate.Year + 1;
}
else
{
monthNumber = Calendar1.VisibleDate.Month + 1;
yearNumber = Calendar1.VisibleDate.Year;
}
DateTime lastDate = new DateTime(yearNumber, monthNumber, 1);
return lastDate;
}
//当为 Calendar 控件在控件层次结构中创建每一天时发生。
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
DateTime nextDate;
FillHolidayTable();
//Calendar控件中容纳每个日期的单元格对象。
TableCell tempCell = e.Cell;
if(tempTable.Rows.Count != 0)
{
//遍历数据库表中的每一条记录。
foreach (Test.CalenderRow tempRow in tempTable)
{
nextDate = tempRow.HolidayDate;
if (nextDate == e.Day.Date)
{
//将从数据库中检索出的对应日期的特殊节日的显示文本加入相应日期单元格。
tempCell.Controls.Add(new LiteralControl("<br>" + tempRow.Holiday));
e.Cell.BackColor = System.Drawing.Color.Pink;//设置特殊日期背景颜色
}
}
}
}
//当用户单击标题标头上的下个月或上个月导航控件时发生。
protected void Calendar1_VisibleMonthChanged(object sender, MonthChangedEventArgs e)
{
FillHolidayTable();
}
}
(5)至此完成设计,在浏览器中测试一下吧。通过选择不同的月份就可以看到相应月中的自定义节日和你的特殊日期信息了。
此外还可以将日期保存在一个31*12的多维数组中,更形象地与当前日期进行比较。但是也仅仅是数据源不同而已。祝您编程愉快!