Como: Exibir datas selecionadas de um banco de dados no controle calendário
O controle Calendar não oferece suporte direto à associação de dados — ou seja, você não vincula o calendário como um todo com uma fonte de dados.Em vez disso, você escreve código para obter os dados que forem necessário, e em seguida, no evento DayRender, você pode comparar a data atualmente processada com os dados de uma fonte de dados de onde você leu.
Para exibir dados do banco de dados no controle Calendário
Use os tipos ADO.NET para se conectar a um banco de dados e consultar as datas para exibir.
No evento DayRender do controle de Calendário, compare a data atualmente sendo processada com os dados que têm recuperados do banco de dados.Se houver uma correspondência, personalizar a exibição de dia.
Exemplo
O exemplo a seguir lê as informações de feriados de um banco de dados em um conjunto de dados do ADO.NET.A seleção obtém datas para o mês atual, definido como o intervalo com base na propriedade VisibleDate do controle Calendar, que retorna a primeira data do mês atual.Sempre que o usuário navega para uma novo mês, o código lê os feriados para esse mês.No evento DayRender, o código compara a data atualmente sendo processado com as datas retornadas pelo banco de dados.Se uma data corresponde, o dia é marcado com uma cor especial.
Observação: |
---|
Você precisará adicionar a propriedade OnDayRender para a marcação do controle de calendário para utilizar o evento DayRender.Por exemplo, seu código deve parecer com o seguinte: |
<asp:Calendar id="Calendar1" OnDayRender=" Calendar1_DayRender" ></asp:Calendar>
Protected dsHolidays As DataSet
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
Calendar1.VisibleDate = DateTime.Today
FillHolidayDataset()
End If
End Sub
Protected Sub FillHolidayDataset()
Dim firstDate As New DateTime(Calendar1.VisibleDate.Year, _
Calendar1.VisibleDate.Month, 1)
Dim lastDate As DateTime = GetFirstDayOfNextMonth()
dsHolidays = GetCurrentMonthData(firstDate, lastDate)
End Sub
Protected Function GetFirstDayOfNextMonth() As DateTime
Dim monthNumber, yearNumber As Integer
If Calendar1.VisibleDate.Month = 12 Then
monthNumber = 1
yearNumber = Calendar1.VisibleDate.Year + 1
Else
monthNumber = Calendar1.VisibleDate.Month + 1
yearNumber = Calendar1.VisibleDate.Year
End If
Dim lastDate As New DateTime(yearNumber, monthNumber, 1)
Return lastDate
End Function
Protected Sub Calendar1_VisibleMonthChanged(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.MonthChangedEventArgs) _
Handles Calendar1.VisibleMonthChanged
FillHolidayDataset()
End Sub
Function GetCurrentMonthData(ByVal firstDate As DateTime, _ ByVal lastDate As DateTime) As DataSet
Dim dsMonth As New DataSet
Dim cs As ConnectionStringSettings
cs = ConfigurationManager.ConnectionStrings("ConnectionString1")
Dim connString As String = cs.ConnectionString
Dim dbConnection As New SqlConnection(connString)
Dim query As String
query = "SELECT HolidayDate FROM Holidays " & _
" WHERE HolidayDate >= @firstDate AND HolidayDate < @lastDate"
Dim dbCommand As New SqlCommand(query, dbConnection)
dbCommand.Parameters.Add(New SqlParameter("@firstDate", firstDate))
dbCommand.Parameters.Add(New SqlParameter("@lastDate", lastDate))
Dim sqlDataAdapter As New SqlDataAdapter(dbCommand)
Try
sqlDataAdapter.Fill(dsMonth)
Catch
End Try
Return dsMonth
End Function
Protected Sub Calendar1_DayRender(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) _
Handles Calendar1.DayRender
Dim nextDate As DateTime
If Not dsHolidays Is Nothing Then
For Each dr As DataRow In dsHolidays.Tables(0).Rows
nextDate = CType(dr("HolidayDate"), DateTime)
If nextDate = e.Day.Date Then
e.Cell.BackColor = System.Drawing.Color.Pink
End If
Next
End If
End Sub
protected DataSet dsHolidays;
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
Calendar1.VisibleDate = DateTime.Today;
FillHolidayDataset();
}
}
protected void FillHolidayDataset()
{
DateTime firstDate = new DateTime(Calendar1.VisibleDate.Year,
Calendar1.VisibleDate.Month, 1);
DateTime lastDate = GetFirstDayOfNextMonth();
dsHolidays = GetCurrentMonthData(firstDate, lastDate);
}
protected DateTime GetFirstDayOfNextMonth()
{
int monthNumber, yearNumber;
if(Calendar1.VisibleDate.Month == 12)
{
monthNumber = 1;
yearNumber = Calendar1.VisibleDate.Year + 1;
}
else
{
monthNumber = Calendar1.VisibleDate.Month + 1;
yearNumber = Calendar1.VisibleDate.Year;
}
DateTime lastDate = new DateTime(yearNumber, monthNumber, 1);
return lastDate;
}
protected DataSet GetCurrentMonthData(DateTime firstDate,
DateTime lastDate)
{
DataSet dsMonth = new DataSet();
ConnectionStringSettings cs;
cs = ConfigurationManager.ConnectionStrings["ConnectionString1"];
String connString = cs.ConnectionString;
SqlConnection dbConnection = new SqlConnection(connString);
String query;
query = "SELECT HolidayDate FROM Holidays " + _
" WHERE HolidayDate >= @firstDate AND HolidayDate < @lastDate";
SqlCommand dbCommand = new SqlCommand(query, dbConnection);
dbCommand.Parameters.Add(new SqlParameter("@firstDate",
firstDate));
dbCommand.Parameters.Add(new SqlParameter("@lastDate", lastDate));
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(dbCommand);
try
{
sqlDataAdapter.Fill(dsMonth);
}
catch {}
return dsMonth;
}
protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
DateTime nextDate;
if(dsHolidays != null)
{
foreach(DataRow dr in dsHolidays.Tables[0].Rows)
{
nextDate = (DateTime) dr["HolidayDate"];
if(nextDate == e.Day.Date)
{
e.Cell.BackColor = System.Drawing.Color.Pink;
}
}
}
}
protected void Calendar1_VisibleMonthChanged(object sender,
MonthChangedEventArgs e)
{
FillHolidayDataset();
}
Este exemplo cria uma consulta com base nas datas no mês exibido no momento.A propriedade VisibleDate retorna a primeira data do mês atual.(A propriedade VisibleDate não é definida até que o usuário navegue no calendário, portanto, na primeira vez a página for exibida, o código define a propriedade VisibleDate manualmente). Uma função auxiliar no código calcula o primeiro dia do mês seguinte com base na propriedade VisibleDate e, portanto, pode ser usado para construir um intervalo de datas no mês atual.
Compilando o código
O código presume que você está usando um banco de dados SQL Server que contém os tabela Holidays.A tabela possui a coluna HolidayDate.A cadeia de caracteres de conexão necessária para conectar ao banco de dados é armazenada no arquivo Web.config sob o nome CadeiaDeCaracteresDeConexao1.
O código presume que você importou os namespaces System.Data e System.Data.SqlClient para que referências a DataSet,SqlConnection e outros objetos possam ser usados sem serem totalmente qualificados.
Programação robusta
Ao consultar o banco de dados, você deve sempre colocar a execução da consulta (neste exemplo, ao chamar o adaptador de dados do método Fill) dentro de um bloco try-catch.