如何:在 Calendar Web 服务器控件中自定义个别日

默认情况下,Calendar 控件中的日显示为数字。如果启用日选择,则数字将显示为链接。有关详细信息,请参见如何:控制 Calendar Web 服务器控件中的用户日期选定

但是,您可以自定义个别日的外观和内容,这包括执行下面的操作:

  • 以编程方式突出显示某些日。例如,以不同的颜色显示假日。

  • 以编程方式指定是否可以选定个别日。

  • 向日显示中添加信息,例如约会或事件信息。

  • 自定义用户可以单击以选择某日的链接文本。

Calendar 控件创建要发送到浏览器的输出时,它将引发 DayRender 事件。控件在准备要显示的日时将为每个日引发该事件,然后您可采用编程的方式检查正显示的是哪个日期,并对其进行适当的自定义。

DayRender 事件的方法带有两个参数,包括对引发事件的控件(Calendar 控件)的引用和一个 DayRenderEventArgs 类型的对象。DayRenderEventArgs 对象提供对另外两个对象的访问:

  • Cell,它是一个 TableCell 对象,可用于设置个别日的外观。

  • Day,可用于查询关于呈现日的信息,控制是否可选择该日,以及将内容添加到日中。Day 对象支持各种可用于了解有关日的信息的属性(例如,IsSelectedIsToday 等)。它还支持 Controls 集合,可操作该集合以将内容添加到日中。

自定义个别日的外观

  1. 创建用于处理 Calendar 控件的 DayRender 事件的方法。

  2. 在该方法中,设置 Cell 对象的属性,您可以使用 DayRenderEventArgs 参数访问此对象。

    下面的示例演示如何更改个别日的外观。该方法使日历中的节假日呈现为黄色,而周末呈现为绿色。在该示例中,节假日是 2005 年 11 月 23 日至 11 月 30 日。

    Visual Basic
    Protected Sub Calendar1_DayRender(ByVal sender As Object, _
            ByVal e As DayRenderEventArgs) Handles Calendar1.DayRender
        ' Display vacation dates in yellow boxes with purple borders.
        Dim vacationStyle As New Style()
        With vacationStyle
            .BackColor = System.Drawing.Color.Yellow
            .BorderColor = System.Drawing.Color.Purple
            .BorderWidth = New Unit(3)
        End With
    
        ' Display weekend dates in green boxes.
        Dim weekendStyle As New Style()
        weekendStyle.BackColor = System.Drawing.Color.Green
    
        ' Vacation is from Nov 23, 2005 to Nov 30, 2005.
        If ((e.Day.Date >= New Date(2005, 11, 23)) _
                And (e.Day.Date <= New Date(2005, 11, 30))) Then
            e.Cell.ApplyStyle(vacationStyle)
        ElseIf (e.Day.IsWeekend) Then
            e.Cell.ApplyStyle(weekendStyle)
        End If
    End Sub
    
    protected void Calendar1_DayRender(object sender, 
        DayRenderEventArgs e)
    {
        // Display vacation dates in yellow boxes with purple borders.
        Style vacationStyle = new Style();
        vacationStyle.BackColor = System.Drawing.Color.Yellow;
        vacationStyle.BorderColor = System.Drawing.Color.Purple;
        vacationStyle.BorderWidth = 3;
    
        // Display weekend dates in green boxes.
        Style weekendStyle = new Style();
        weekendStyle.BackColor = System.Drawing.Color.Green;
    
        if ((e.Day.Date >= new DateTime(2000,11,23)) &&
            (e.Day.Date <= new DateTime(2000,11,30)))
        {
            // Apply the vacation style to the vacation dates.
            e.Cell.ApplyStyle(vacationStyle);
        }
        else if (e.Day.IsWeekend)
        {
            // Apply the weekend style to the weekend dates.
            e.Cell.ApplyStyle(weekendStyle);
        }
    

指定可选定个别日

  1. 在用于 Calendar 控件的 DayRender 事件的方法中,通过从 Day 对象的 Date 属性中获取信息来确定哪一日被呈现。

  2. 将该日的 IsSelectable 属性设置为 true。

    下面的示例演示如何将日期 2005 年 10 月 1 日设置为可选的,而所有其他日期都为不可选的。

    Visual Basic
    Protected Sub Calendar1_DayRender(ByVal sender As Object, _
            ByVal e As DayRenderEventArgs) Handles Calendar1.DayRender
        Dim myAppointment As Date = New Date(2005, 10, 1)
        If (e.Day.Date = myAppointment) Then
            e.Day.IsSelectable = True
        Else
            e.Day.IsSelectable = False
        End If
    End Sub
    

     

    protected void Calendar1_DayRender(object sender, 
        DayRenderEventArgs e)
    {
        DateTime myAppointment = new DateTime(2005, 10, 1);
        if (e.Day.Date == myAppointment)
        {
            e.Day.IsSelectable = true;
        }
        else
        {
            e.Day.IsSelectable = false; 
        }
    }
    

向个别日中添加内容

  • 在用于 Calendar 控件的 DayRender 事件的处理程序中,将任何 HTML 或 ASP.NET Web 控件添加到来自于 DayRenderEventArgs 参数的 Day 对象的 Controls 集合中。

    下面的示例显示假日。在页面加载过程中,将以二维数组创建假日列表。假日描述将被加载到与其日期对应的元素中。在 DayRender 事件的方法中,将每个日与假日数组进行比较。如果对应的假日数组元素中包含值,则使用假日文本创建一个 Label 控件,并将其添加到该日的 Controls 集合中。

    Visual Basic
    Dim holidays(13, 32) As String
    
    Protected Sub Page_Load(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Me.Load
        holidays(1, 1) = "Birthday"
        holidays(2, 14) = "Anniversary"
    End Sub
    
    Protected Sub Calendar1_DayRender(ByVal sender As Object, _
            ByVal e As DayRenderEventArgs) Handles Calendar1.DayRender
        If e.Day.IsOtherMonth Then
            e.Cell.Controls.Clear()
        Else
            Dim aDate As Date = e.Day.Date
            Dim aHoliday As String = holidays(aDate.Month, aDate.Day)
            If (Not aHoliday Is Nothing) Then
                Dim aLabel As Label = New Label()
                aLabel.Text = "<br>" & aHoliday
                e.Cell.Controls.Add(aLabel)
            End If
        End If
    End Sub
    

     

    string[,] holidays = new String[13, 32];
    
    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
    {
        string aHoliday;
        DateTime theDate = e.Day.Date;
        aHoliday = holidays[theDate.Month, theDate.Day];
        if (aHoliday != null)
        {
            Label aLabel = new Label();
            aLabel.Text = " <br>" + aHoliday;
            e.Cell.Controls.Add(aLabel);
        }
    
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        holidays[1, 1] = "Birthday";
        holidays[2, 14] = "Anniversary";
    }
    

自定义个别日的链接文本

  1. 在用于 Calendar 控件的 DayRender 事件的方法中,获取 DayRenderEventArgs 参数的 SelectUrl 属性。SelectUrl 属性将返回 JavaScript,通常为该日呈现此 JavaScript 以引起指示日期选择的回发。

  2. 使用串联创建用 SelectUrl 属性的值作为 href 属性的 HTML 超链接。

  3. 将超链接添加为 Cell 对象的 Text 属性。

    下面的示例显示假日。在页面加载过程中,将以二维数组创建假日列表。假日描述将被加载到与其日期对应的元素中。在 DayRender 事件的方法中,将每个日与假日数组进行比较。如果对应的假日数组元素包含值,则代码将创建显示假日名而非日编号的链接文本。

    Visual Basic
    Dim holidays(13, 32) As String
    
    Protected Sub Page_Load(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Me.Load
        holidays(1, 1) = "Birthday"
        holidays(2, 14) = "Anniversary"
    End Sub
    
    Protected Sub Calendar1_DayRender(ByVal sender As Object, _
            ByVal e As DayRenderEventArgs) Handles Calendar1.DayRender
        If e.Day.IsOtherMonth Then
            e.Cell.Controls.Clear()
        Else
            Dim aDate As Date = e.Day.Date
            Dim aHoliday As String = holidays(aDate.Month, aDate.Day)
            If (Not aHoliday Is Nothing) Then
                e.Cell.Text = _
                    "<a href=" & e.SelectUrl & ">" & aHoliday & "</a>"
            End If
        End If
    End Sub
    

     

    string[,] holidays = new String[13, 32];
    
    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
    {
        string aHoliday;
        DateTime theDate = e.Day.Date;
        aHoliday = holidays[theDate.Month, theDate.Day];
        if (aHoliday != null)
        {
            e.Cell.Text = "<a href=" + e.SelectUrl + ">" + 
               aHoliday + "</a>";
        }
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        holidays[1, 1] = "Birthday";
        holidays[2, 14] = "Anniversary";
    }
    

请参见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fanhgye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值