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: