방법: Calendar 웹 서버 컨트롤의 개별 일자 사용자 지정

Visual Studio 2010

업데이트: 2007년 11월

기본적으로 Calendar 컨트롤의 일자는 숫자로 표시됩니다. 일자 선택을 사용하도록 설정하면 숫자가 링크로 나타납니다. 자세한 내용은 방법: Calendar 웹 서버 컨트롤에서 사용자 정의 날짜 선택 제어를 참조하십시오.

개별 일자의 모양과 내용을 사용자 지정하여 다음과 같은 작업을 수행할 수 있습니다.

  • 프로그래밍 방식으로 특정 일자를 강조합니다. 예를 들어, 공휴일을 다른 색으로 표시합니다.

  • 개별 일자를 선택할 수 있는지 여부를 프로그래밍 방식으로 지정합니다.

  • 약속 또는 행사 일정과 같은 정보를 일자 표시에 추가합니다.

  • 사용자가 일자를 선택하기 위해 클릭할 수 있는 링크 텍스트를 사용자 지정합니다.

Calendar 컨트롤은 브라우저로 보낼 출력을 만들 때 DayRender 이벤트를 발생시킵니다. 컨트롤이 표시할 일자를 준비하면서 각 일자에 대한 이벤트를 발생시키면 렌더링할 날짜를 프로그래밍 방식으로 검사하여 적절히 사용자 지정할 수 있습니다.

DayRender 이벤트 메서드는 두 개의 인수를 취합니다. 하나는 이벤트를 발생시키는 컨트롤에 대한 참조(Calendar 컨트롤)이고 다른 하나는 DayRenderEventArgs 형식의 개체입니다. DayRenderEventArgs 개체는 다음과 같은 두 개의 추가 개체에 대한 액세스를 제공합니다.

  • Cell, 개별 일자의 모양을 설정하는 데 사용할 수 있는 TableCell 개체입니다.

  • Day, 렌더링되는 일자에 대한 정보를 쿼리하고, 일자를 선택할 수 있는지 여부를 제어하며, 일자에 내용을 추가하는 데 사용할 수 있습니다. Day 개체는 일자에 대한 정보를 얻는 데 사용할 수 있는 다양한 속성을 지원합니다(예: IsSelected, IsToday 등). 또한 이 개체는 Controls 컬렉션을 지원하기 때문에 이를 조작하여 일자에 내용을 추가할 수 있습니다.

개별 일자의 모양을 사용자 지정하려면

  1. Calendar 컨트롤의 DayRender 이벤트를 처리하기 위한 메서드를 만듭니다.

  2. 메서드에서 DayRenderEventArgs 인수로 액세스할 수 있는 Cell 개체의 속성을 설정합니다.

    다음 예제에서는 개별 일자의 모양을 변경하는 방법을 보여 줍니다. 이 메서드는 달력의 휴가 일자를 노란색으로, 주말을 녹색으로 렌더링합니다. 예제에서 휴가 일자는 2005년 11월 23일에서 11월 30일까지입니다.

    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일만 선택 가능한 날짜로 설정하고 다른 날짜는 선택할 수 없도록 설정하는 방법을 보여 줍니다.

    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 이벤트에 대한 처리기에서 DayRenderEventArgs 인수에서 가져온 Day 개체의 Controls 컬렉션에 HTML 또는 ASP.NET 웹 컨트롤을 추가합니다.

    다음 예제는 공휴일을 표시합니다. 공휴일 목록은 페이지를 로드하는 동안 이차원 배열로 만들어집니다. 공휴일 설명은 해당 날짜의 요소로 로드됩니다. 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. Calendar 컨트롤의 DayRender 이벤트에 대한 메서드에서 DayRenderEventArgs 인수의 SelectUrl 속성을 가져옵니다. SelectUrl 속성은 날짜 선택을 다시 게시하도록 해당 일자에 대해 일반적으로 렌더링되는 JavaScript를 반환합니다.

  2. 연결을 사용하여 href 특성으로 SelectUrl 속성 값을 사용하는 HTML 하이퍼링크를 만듭니다.

  3. Cell 개체의 Text 속성으로 하이퍼링크를 추가합니다.

    다음 예제는 공휴일을 표시합니다. 공휴일 목록은 페이지를 로드하는 동안 2차원 배열로 만들어집니다. 공휴일 설명은 해당 날짜의 요소로 로드됩니다. 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";
    }
    
표시: