Практическое руководство. Настройка отдельных дней в серверном веб-элементе управления Calendar

Visual Studio 2010

Обновлен: Ноябрь 2007

По умолчанию дни в элементе управления Calendar отображаются просто как числа. Если включен выбор дней, числа выводятся как ссылки. Дополнительные сведения см. в разделе Практическое руководство. Управление выбором даты в серверном веб-элементе управления Calendar.

Однако можно настроить внешний вид и содержимое отдельных дней, что позволяет выполнять следующие действия.

  • Программно выделять определенные дни, например, отображать выходные другим цветом.

  • Программно задавать возможность выбора отдельного дня.

  • Добавлять сведения в отображение дня, например сведения о встречах или мероприятиях.

  • Настраивать текст ссылки, которую могут нажать пользователи для выбора дня.

Когда элемент управления Calendar создает выходные данные для отправки обозревателю, то запускает событие DayRender. Во время подготовки отображения дня элемент управления вызывает событие для каждого дня, после чего можно программно определить воспроизводимую дату и настроить ее соответствующим образом.

Метод события DayRender содержит два аргумента: ссылку на элемент управления, вызывающий событие (элемент управления Calendar) и объект типа DayRenderEventArgs. Объект DayRenderEventArgs предоставляет доступ к двум дополнительным объектам.

  • Cell, объект TableCell можно использовать для установки внешнего вида отдельного дня.

  • Day, который можно использовать для запроса сведений о воспроизводимом дне, проверки, был ли выбран день, а также добавления в день содержимого. Объект Day поддерживает различные свойства, применяемые для получения сведений о дне (например, IsSelected, IsToday и т. п.). Он также поддерживает коллекцию Controls, которую можно изменять для добавления в день содержимого.

Чтобы настроить внешний вид отдельного дня

  1. Создайте метод для обработки события DayRender элемента управления Calendar.

  2. Для метода установите свойства объекта Cell, доступ к которому можно получить при помощи аргумента DayRenderEventArgs.

    Следующий пример показывает, как изменить внешний вид отдельных дней. С помощью этого метода дни отпуска воспроизводятся в календаре желтым цветом, а выходные — зеленым. В примере днями отпуска являются дни с 23 ноября по 30 ноября 2005 года.

    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. Определите отображаемый день в методе для события DayRender элемента управления Calendar путем получения сведений из свойства Date объекта Day.

  2. Установите для свойства дня IsSelectable значение «истина».

    Следующий пример показывает, как сделать доступным для выбора дату 1 октября 2005 года, а все остальные даты сделать недоступными.

    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; 
        }
    }
    

Чтобы добавить содержимое в отдельный день

  • В обработчике для события DayRender элемента управления Calendar добавьте любой веб-элемент управления HTML или ASP.NET к коллекции Controls объекта Day из аргумента DayRenderEventArgs.

    В следующем примере отображаются праздники. Список праздников создается как двумерный массив при загрузке страницы. Описания праздников загружаются в элементы с соответствующей датой. В методе события DayRender каждый день сравнивается с массивом праздников. Если соответствующий элемент массива праздников содержит значение, создается элемент управления Label, в котором определен соответствующий текст. Этот элемент добавляется в коллекцию Controls для этого дня.

    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. В методе для события DayRender элемента управления Calendar, извлеките свойство SelectUrl аргумента DayRenderEventArgs. Свойство SelectUrl возвращает компонент JavaScript, который отображается для данного для в обычном режиме и вызывает обратную передачу, обозначающую выбор даты.

  2. При помощи объединения строк создайте гиперссылку HTML, использующую значение свойства SelectUrl в качестве атрибута href.

  3. Добавьте гиперссылку как свойство Text объекта Cell.

    В следующем примере отображаются праздники. Список праздников создается как двумерный массив при загрузке страницы. Описания праздников загружаются в элементы с соответствующей датой. В методе события DayRender каждый день сравнивается с массивом праздников. Если соответствующий элемент массива праздников содержит значение, то код создает текст ссылки, отображающей название праздника вместо числа месяца.

    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";
    }
    
Показ: