Gewusst wie: Anzeigen von ausgewählten Daten aus einer Datenbank im Calendar-Steuerelement

Aktualisiert: November 2007

Datenbindung wird vom Calendar-Steuerelement nicht direkt unterstützt. Der Kalender als Ganzes kann also nicht an eine Datenquelle gebunden werden. Schreiben Sie stattdessen Code, der die benötigten Daten abruft, und vergleichen Sie dann im DayRender-Ereignis das aktuell gerenderte Datum mit den von der Datenquelle gelesenen Daten.

So zeigen Sie Daten aus der Datenbank im Calendar-Steuerelement an

  1. Verwenden Sie ADO.NET-Typen, um eine Verbindung zu einer Datenbank herzustellen und die gewünschten Daten abzufragen.

  2. Vergleichen Sie innerhalb des DayRender-Ereignisses des Calendar-Steuerelements das aktuell gerenderte Datum mit den von der Datenbank gelesenen Daten. Passen Sie bei einer Übereinstimmung der Daten die Tagesanzeige an.

Beispiel

Im folgenden Beispiel werden Feiertagsinformationen aus einer Datenbank in ein ADO.NET-Dataset gelesen. Die Auswahl ruft die Daten für den aktuellen Monat ab. Der aktuelle Monat wird mithilfe der VisibleDate-Eigenschaft des Calendar-Steuerelements bestimmt. Diese Eigenschaft gibt das erste Datum des aktuellen Monats zurück. Jedes Mal, wenn der Benutzer zu einem neuen Monat navigiert, werden durch den Code die Feiertage für diesen Monat gelesen. Im Code für das DayRender-Ereignis wird das momentan gerenderte Datum mit den Datumsangaben aus der Datenbank verglichen. Wenn das Datum übereinstimmt, wird der entsprechende Tag mit einer besonderen Farbe gekennzeichnet.

Hinweis:

Zum Markup des Calendar-Steuerelements muss die OnDayRender-Eigenschaft hinzugefügt werden, um das DayRender-Ereignis verwenden zu können. Der Code sollte beispielsweise so aussehen:

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

In diesem Beispiel wird auf Grundlage der Datumsangaben für den aktuell angezeigten Monat eine Abfrage erstellt. Die VisibleDate-Eigenschaft gibt das erste Datum des aktuellen Monats zurück. (Die VisibleDate-Eigenschaft wird erst durch Navigieren des Benutzers im Kalender festgelegt. Beim erstmaligen Anzeigen der Seite wird die VisibleDate-Eigenschaft im Code explizit festgelegt.) Mit einer Hilfsfunktion im Code wird auf Grundlage der VisibleDate-Eigenschaft der erste Tag des Folgemonats berechnet. Dadurch kann ein Datumsbereich innerhalb des aktuellen Monats erstellt werden.

Kompilieren des Codes

Im Code wird davon ausgegangen, dass Sie eine SQL Server-Datenbank mit einer Tabelle mit dem Namen Holidays verwenden. Die Tabelle enthält die Spalte HolidayDate. Die Verbindungszeichenfolge, die für die Verbindung mit der Datenbank benötigt wird, wird in der Datei Web.config unter dem Namen ConnectionString1 abgelegt.

Im Code wird davon ausgegangen, dass Sie den System.Data-Namespace und den System.Data.SqlClient-Namespace importiert haben, sodass Referenzen auf DataSet, SqlConnection und andere Objekte auch ohne den voll qualifizierten Namen verwendet werden können.

Robuste Programmierung

Wenn Sie eine Datenbankabfrage vornehmen, sollten Sie die Ausführung der Abfrage (in diesem Beispiel bei Aufruf der Fill-Methode des Datenadapters) immer in einen try-catch-Block einschließen.

Siehe auch

Konzepte

Übersicht über das Calendar-Webserversteuerelement