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

  1. Use os tipos ADO.NET para se conectar a um banco de dados e consultar as datas para exibir.

  2. 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.

Consulte também

Conceitos

Visão geral sobre controle do Servidor Web de calendário