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.

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.

ms228044.alert_note(de-de,VS.100).gifHinweis:

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" runat="server" ></asp:Calendar>
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.

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.

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.

Community-Beiträge

HINZUFÜGEN
Anzeigen: