十、如何:读取 Calendar Web 服务器控件中的选定日期
第一个示例显示当前选定的日。第二个示例显示所有选定的日期,可以是单个日、周或月。
// Example 1
Label1.Text = Calendar1.SelectedDate.ToShortDateString();
// Example 2
String s = "";
foreach(DateTime d in Calendar1.SelectedDates)
{
s += "<br />" + d.ToShortDateString();
}
Label1.Text = s;
此示例需要:
·Web 窗体页。
·名为Calendar1 的 Calendar 控件。
·名为Label1 的 Label 控件。
可靠编程:
如果只选择一日,则 SelectedDates 属性将只获取一个日期。如果选择一周或一月,则 SelectedDate 属性将获取该集合的第一个日期。
十一、如何:在 Calendar Web 服务器控件中以编程方式选择日期
可用您自己的代码设置日期选定,包括单个日期或一个日期范围。与页上控件中的用户选定不同,您可在代码中选定多个非连续日期。
说明: 以编程方式设置日期不会引发 SelectionChanged 事件。
A、选定单个日期
将控件的 SelectedDate 属性设置为 DateTime 类型的表达式。
Calendar1.SelectedDate = DateTime.Today;
说明: 如果设置 SelectedDate,则 SelectedDates 中的所有日期都会被有效地清除。
B、选择日期范围
调用控件的 SelectedDates 集合的 Add 方法。可按任意顺序添加日期,因为集合将自动对日期进行排序。集合还强制实现唯一性,因此如果添加的日期已经存在于集合中,则集合将忽略该日期。
下面的示例将日期选定设置为 2000 年 2 月中的每个星期三。
public void Button1_Click (object sender, System.EventArgs e)
{
SelectedDatesCollection theDates = Calendar1.SelectedDates;
theDates.Clear();
theDates.Add(new DateTime(2000,2,2));
theDates.Add(new DateTime(2000,2,9));
theDates.Add(new DateTime(2000,2,16));
theDates.Add(new DateTime(2000,2,23));
}
下面的示例选择一个包含七个日期的序列。
DateTime aDate = DateTime.Today;
SelectedDatesCollection theDates = Calendar1.SelectedDates;
theDates.Clear();
for (int i = 0;i <= 6;i++)
{
theDates.Add(aDate.AddDays(i));
}
C、清除日期选定
调用控件的 SelectedDates 集合的 Clear 方法,如下面的示例所示:
Calendar1.SelectedDates.Clear();
十二、如何:在 Calendar Web 服务器控件中以编程方式设置当前日期
默认情况下,Calendar 控件中“today”(今天)的值设置为与运行 Web 窗体页的服务器的日期相匹配的值。但是,您可能需要调整该日期,使其适应在不同的时区中查看网页的用户的需要。
将 Calendar 控件的 TodaysDate 属性设置为 DateTime 值。
下面的示例将 TodaysDate 设置为“tomorrow”(明天),然后将 SelectedDate 设置为 TodaysDate。在浏览器中,对应于“tomorrow”(明天)的日期将突出显示。
DateTime tomorrow = DateTime.Today.AddDays(1);
Calendar1.TodaysDate = tomorrow;
Calendar1.SelectedDate = Calendar1.TodaysDate;
下面的示例演示如何用选择的日期填充 DropDownList 控件并根据用户在列表中的选择设置“日历”控件中的当天日期值。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DateTime today = System.DateTime.Today;
DateTime yesterday = today.AddDays(-1);
DateTime tomorrow = today.AddDays(1);
DropDownList1.Items.Add(String.Format("{0:dd MMM yyyy}",
today));
DropDownList1.Items.Add(String.Format("{0:dd MMM yyyy}",
yesterday));
DropDownList1.Items.Add(String.Format("{0:dd MMM yyyy}",
tomorrow));
}
}
protected void DropDownList1_SelectedIndexChanged(object sender,
EventArgs e)
{
Calendar1.TodaysDate =
DateTime.Parse(DropDownList1.SelectedItem.Text);
}
十三、如何:在 Calendar 控件中显示数据库中的选定日期
Calendar 控件并不直接支持数据绑定,也就是说,您不是将日历作为一个整体绑定到数据源。相反,您编写代码来获取所需数据,然后就可以在 DayRender 事件中,将当前呈现的日期与从数据源读取的数据进行比较。
A、在 Calendar 控件中显示数据库数据
1、使用 ADO.NET 类型连接到数据库并查询要显示的日期。
2、在 Calendar 控件的 DayRender 事件中,将当前呈现的日期与从数据库中检索到的数据进行比较。如果存在匹配项,则自定义相应的日期显示。
B、示例
下面的示例将假日信息从数据库读取到一个 ADO.NET 数据集。当您选定一个月份时,将获取当前所选月份的日期,此日期范围是基于 Calendar 控件的 VisibleDate 属性定义的,该属性返回当前月的第一个日期。每次用户导航到一个新的月份时,代码就会读取该月份的假日。在 DayRender 事件中,代码会将当前呈现的日期与从数据库返回的日期进行比较。如果有匹配的日期,则用特殊颜色标记这一天。
说明: 需要对 Calendar 控件标记添加 OnDayRender 属性,以便使用 DayRender 事件。例如,代码应类似于下面的示例:
<asp:Calendar id="Calendar1" OnDayRender=" Calendar1_DayRender" runat="server" ></asp:Calendar>
protected DataSet dsHolidays;
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
Calendar1.VisibleDate = DateTime.Today;
FillHolidayDataset();
}
}
protected void FillHolidayDataset()
{
DateTime firstDate = new DateTime(Calendar1.VisibleDate.Year,
Calendar1.VisibleDate.Month, 1);
DateTime lastDate = GetFirstDayOfNextMonth();
dsHolidays = GetCurrentMonthData(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;
}
protected DataSet GetCurrentMonthData(DateTime firstDate,
DateTime lastDate)
{
DataSet dsMonth = new DataSet();
ConnectionStringSettings cs;
cs = ConfigurationManager.ConnectionStrings["ConnectionString1"];
String connString = cs.ConnectionString;
SqlConnection dbConnection = new SqlConnection(connString);
String query;
query = "SELECT HolidayDate FROM Holidays " + _
" WHERE HolidayDate >= @firstDate AND HolidayDate < @lastDate";
SqlCommand dbCommand = new SqlCommand(query, dbConnection);
dbCommand.Parameters.Add(new SqlParameter("@firstDate",
firstDate));
dbCommand.Parameters.Add(new SqlParameter("@lastDate", lastDate));
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(dbCommand);
try
{
sqlDataAdapter.Fill(dsMonth);
}
catch {}
return dsMonth;
}
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
DateTime nextDate;
if(dsHolidays != null)
{
foreach(DataRow dr in dsHolidays.Tables[0].Rows)
{
nextDate = (DateTime) dr["HolidayDate"];
if(nextDate == e.Day.Date)
{
e.Cell.BackColor = System.Drawing.Color.Pink;
}
}
}
}
protected void Calendar1_VisibleMonthChanged(object sender,
MonthChangedEventArgs e)
{
FillHolidayDataset();
}
此示例基于当前显示的月份的日期生成一个查询。VisibleDate 属性返回当前月的第一个日期。(在用户导航到日历中之前,不会设置 VisibleDate 属性,因此在第一次显示该页时,代码会手动设置 VisibleDate 属性。) 代码中的一个辅助函数会根据 VisibleDate 属性计算下个月的第一天,因此可以用于生成当前月的日期范围。
C、编译代码
代码假设使用的是一个 SQL Server 数据库,其中包含 Holidays 表。该表具有列 HolidayDate。连接到该数据库所需的连接字符串存储在 Web.config 文件中,名为 ConnectionString1。
代码假设已经导入了命名空间 System.Data 和 System.Data.SqlClient,因此无需完全限定即可使用对 DataSet、SqlConnection 和其他对象的引用。
D、可靠编程
查询数据库时,应始终将查询的执行(在此示例中,即为调用数据适配器的 Fill 方法时)包含在一个 try-catch 块中。