ASP.NET - Calendar Web 服务器控件概述(下)

 

十、如何:读取 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,因此无需完全限定即可使用对 DataSetSqlConnection 和其他对象的引用。

 

      D、可靠编程

查询数据库时,应始终将查询的执行(在此示例中,即为调用数据适配器的 Fill 方法时)包含在一个 try-catch 块中。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值