ASP .NET - Destacando feriados no objeto Calendar


Há muito tempo atrás, no meu artigo, ASP.NET - Usando o objeto Calendar, eu apresentei o objeto Calendar da ASP .NET mostrando suas propriedades e apresentei alguns exemplos, sendo que um deles referia-se a carregar a partir de um arquivo XML e destacar os feriados no calendário.

Neste artigo eu vou mostrar uma outra forma de destacar os feriados aplicando um estilo a uma data definida como feriado em um HashTable para destacá-lo no objeto Calendar.

O objeto Calendar suporta quatro modos de seleção de data conforme tabela a seguir:

Modo Descrição
Day Pode ser selecionado qualquer dia
DayWeek Pode ser selecionado um único dia ou uma semana inteira
DayWeekMonth Pode ser selecionado um único dia , uma semana inteira ou um mês inteiro
None A seleção de datas esta desabilitada

Além disso você pode incluir destaques em datas no objeto Calendar tratando o evento OnDayRender.

O evento OnDayRender usa dois argumentos :

Usando este recurso podemos incluir um texto customizado a célula para um dia particular adicionando o texto como um LiteralControl para a coleção de células do objeto. Exemplo: Cells.Controls.Add(New LiteralControl("<br>" + Feriado))

É isso que estamos fazendo no exemplo deste artigo.

Vamos abrir o Visual Web Developer 2010 Express Edition e criar um novo Web Site : File -> New Web Site;

Escolha a linguagem Visual Basic e o template ASP .NET Web Site informando o nome CalendarioFeriados;

Escolhendo este template será criada uma solução com alguns recursos que não iremos precisar portanto podemos deixar a solução somente com os seguintes recursos:

Desta forma teremos uma estrutura com a página Default.aspx , a página About.aspx e a Master Page Site.Master, incluindo os estilos usados nessas páginas.

Na verdade irei usar somente a página Default.aspx então inclua nesta página um objeto Calendar(ID=Calendario) e um controle Label (ID=lblMsg) conforme a figura abaixo:

A seguir no code-behind do arquivo Default.aspx vamos incluir o código que vai fazer tudo funcionar.

Primeiro vamos definir os namespaces usados no projeto:

using System;
using System.Web.UI.WebControls;
using System.Collections;

A seguir vamos definir uma variável que será visivel no projeto e que representará a nossa tabela de feriados:

Dim ListaFeriados As Hashtable Hashtable ListaFeriados
VB .NET C#

Primeiro vamos definir uma tabela Hash com os feriados de 2011:

Private Function GetFeriado() As Hashtable

Dim feriado As New Hashtable()
feriado("01/01/2011") = "Ano Novo"
feriado("08/03/2011") = "Carnaval"
feriado("21/04/2011") = "Tiradentes"
feriado("22/04/2011") = "Sexta-feira da Paixão"
feriado("01/05/2011") = "Dia do Trabalho"
feriado("23/06/2011") = "Corpus Christi"
feriado("07/09/2011") = "Independência do Brasil"
feriado("12/10/2011") = "Nossa Senhora Aparecida"
feriado("02/11/2011") = "Finados"
feriado("15/11/2011") = "Proclamação da República"
feriado("25/12/2011") = "Natal"
Return feriado
End Function
private Hashtable GetFeriado()
{
Hashtable feriado = new Hashtable();
feriado["01/01/2011"] = "Ano Novo";
feriado["08/03/2011"] = "Carnaval";
feriado["21/04/2011"] = "Tiradentes";
feriado["22/04/2011"] = "Sexta-feira da Paixão";
feriado["01/05/2011"] = "Dia do Trabalho";
feriado["23/06/2011"] = "Corpus Christi";
feriado["07/09/2011"] = "Independência do Brasil";
feriado["12/10/2011"] = "Nossa Senhora Aparecida";
feriado["02/11/2011"] = "Finados";
feriado["15/11/2011"] = "Proclamação da República";
feriado["25/12/2011"] = "Natal";
return feriado;
}
VB .NET C#

No evento Load da página Default.aspx , obtemos a lista de feriados e definimos a formatação do nosso calendário:

Protected Sub Page_Load(sender As Object, e As EventArgs)

 ListaFeriados = GetFeriado()
 Calendario.Caption = "Calendário - 2011 "
 Calendario.FirstDayOfWeek = FirstDayOfWeek.Sunday
 Calendario.NextPrevFormat = NextPrevFormat.FullMonth
 Calendario.TitleFormat = TitleFormat.MonthYear
 Calendario.ShowGridLines = True
 Calendario.DayStyle.Height = New Unit(50)
 Calendario.DayStyle.Width = New Unit(50)
 Calendario.DayStyle.HorizontalAlign = HorizontalAlign.Center
 Calendario.DayStyle.VerticalAlign = VerticalAlign.Middle
 Calendario.OtherMonthDayStyle.BackColor = System.Drawing.Color.AliceBlue

End Sub
protected void Page_Load(object sender, EventArgs e)
{
ListaFeriados = GetFeriado();
Calendario.Caption = "Calendário - 2011 ";
Calendario.FirstDayOfWeek = FirstDayOfWeek.Sunday;
Calendario.NextPrevFormat = NextPrevFormat.FullMonth;
Calendario.TitleFormat = TitleFormat.MonthYear;
Calendario.ShowGridLines = true;
Calendario.DayStyle.Height = new Unit(50);
Calendario.DayStyle.Width = new Unit(50);
Calendario.DayStyle.HorizontalAlign = HorizontalAlign.Center;
Calendario.DayStyle.VerticalAlign = VerticalAlign.Middle;
Calendario.OtherMonthDayStyle.BackColor = System.Drawing.Color.AliceBlue;

}
VB .NET C#

No evento DayRender verificamos se a informação da HashTable é igual ao dia atual e aplicamos a formatação especial:


Protected Sub Calendar1_DayRender(sender As Object, e As DayRenderEventArgs)

If ListaFeriados(e.Day.[Date].ToShortDateString()) IsNot Nothing Then
   Dim literal1 As New Literal()
   literal1.Text = "<br/>"
   e.Cell.Controls.Add(literal1)
   Dim label1 As New Label()
   label1.Text = DirectCast(ListaFeriados(e.Day.[Date].ToShortDateString()), String)
   label1.Font.Name = "Trebuchet MS"
   label1.Font.Size = New FontUnit(FontSize.Medium)
   label1.ForeColor = System.Drawing.Color.DarkOrange
   label1.Font.Bold = True
   e.Cell.Controls.Add(label1)
End If
End Sub
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
 if (ListaFeriados[e.Day.Date.ToShortDateString()] != null)
 {
    Literal literal1 = new Literal();
    literal1.Text = "<br/>";
    e.Cell.Controls.Add(literal1);
    Label label1 = new Label();
    label1.Text = (string)ListaFeriados[e.Day.Date.ToShortDateString()];
    label1.Font.Name = "Trebuchet MS";
    label1.Font.Size = new FontUnit(FontSize.Medium);
    label1.ForeColor = System.Drawing.Color.DarkOrange;
    label1.Font.Bold = true;
    e.Cell.Controls.Add(label1);
 }
}
VB .NET  C# 

A seguir temos o código dos eventos SelectionChanged e VisibleMonthChange que são acionados quando uma data e um mês são alterados:

Protected Sub Calendar1_SelectionChanged(sender As Object, e As EventArgs)
   lblMsg.Text = "Data alterada para : " & Calendario.SelectedDate.ToShortDateString()
End Sub

Protected Sub Calendar1_VisibleMonthChanged(sender As Object, e As MonthChangedEventArgs)
   lblMsg.Text = "Mês alterado para : " & e.NewDate.ToShortDateString()
End Sub
VB .NET
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
   lblMsg.Text = "Data alterada para : " + Calendario.SelectedDate.ToShortDateString();
}

protected void Calendar1_VisibleMonthChanged(object sender, MonthChangedEventArgs e)
{
   lblMsg.Text = "Mês alterado para : " + e.NewDate.ToShortDateString();
}
C#

Executando o web site iremos obter o seguinte resultado final:

Simples, simples assim

Eu sei é apenas ASP .NET com C# e VB .NET, mas eu gosto...

Referências:

José Carlos Macoratti