Comment : afficher des dates sélectionnées d'une base de données dans le contrôle Calendar

Mise à jour : novembre 2007

Le contrôle Calendar ne prend pas directement en charge la liaison de données ; autrement dit, vous ne liez pas le calendrier dans son ensemble à une source de données. À la place, vous écrivez du code pour obtenir les données dont vous avez besoin puis, dans l'événement DayRender, vous pouvez comparer la date actuellement rendue aux données que vous avez lues dans une source de données.

Pour afficher des données de base de données dans le contrôle Calendar

  1. Utilisez des types ADO.NET pour vous connecter à une base de données et exécuter une requête sur les dates à afficher.

  2. Dans l'événement DayRender du contrôle Calendar, comparez la date actuellement rendue aux données que vous avez récupérées dans la base de données. S'il y a une correspondance, personnalisez l'affichage du jour.

Exemple

L'exemple suivant lit des informations relatives aux jours fériés d'une base de données dans un groupe de données ADO.NET. La sélection obtient des dates pour le mois en cours, définies comme plage selon la propriété VisibleDate du contrôle Calendar qui retourne la première date du mois en cours. Chaque fois que l'utilisateur navigue vers un nouveau mois, le code lit les jours fériés de ce mois. Dans l'événement DayRender, le code compare la date actuellement rendue aux dates retournées par la base de données. Si une date correspond, le jour est marqué avec une couleur spéciale.

Remarque :

Vous devrez ajouter la propriété OnDayRender au balisage du contrôle Calendar pour utiliser l'événement DayRender. Par exemple, votre code doit ressembler à l'exemple suivant :

<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();
}

Cet exemple génère une requête basée sur les dates du mois actuellement affiché. La propriété VisibleDate retourne la première date du mois en cours. (La propriété VisibleDate n'est pas définie tant que l'utilisateur n'a pas navigué dans le calendrier, de sorte que la première fois que la page est affichée, le code définit la propriété VisibleDate manuellement.) Une fonction d'assistance dans le code calcule le premier jour du mois suivant en fonction de la propriété VisibleDate et peut donc être utilisée pour générer une plage de dates dans le mois en cours.

Compilation du code

Le code suppose que vous utilisez une base de données SQL Server contenant la table de jours fériés Holidays. La table possède la colonne HolidayDate. La chaîne de connexion requise pour se connecter à la base de données est stockée dans le fichier Web.config sous le nom ConnectionString1.

Le code suppose que vous avez importé les espaces de noms System.Data et System.Data.SqlClient afin que les références à DataSet, SqlConnection et à d'autres objets puissent être utilisées sans être qualifiées complètes.

Programmation fiable

Lorsque vous interrogez la base de données, vous devez toujours placer l'exécution de la requête (dans cet exemple, lors de l'appel de la méthode Fill de l'adaptateur de données) dans un bloc try-catch.

Voir aussi

Concepts

Vue d'ensemble du contrôle serveur Web Calendar