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
Verwenden Sie ADO.NET-Typen, um eine Verbindung zu einer Datenbank herzustellen und die gewünschten Daten abzufragen.
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.