ASP.NET II / Kalender kontrollen / Et lille kodeeksempel
ASP.NET fjernundervisningskursus- Vil du gerne på kursus NU? - Vil du gerne lære i dit eget tempo? - Har du ikke tid til at tage på kursus ude i byen? Så køb et kursus i ASP.NET som fjernundervisning på www.it-fjernundervisning.dk |
Kalender kontrollen.
Nedenfor findes et lille kodeeksempel på anvendelse af kalender kontrollen.
HTML'en
Først den html jeg har skrevet:
<HTML>
<HEAD>
<title>Kalender</title>
<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie3-2nav3-0">
</HEAD>
<body MS_POSITIONING="FlowLayout">
<form id="Form1" method="post" runat="server">
<P>
<asp:calendar id="Kalender" runat="server" SelectionMode="DayWeekMonth"
BorderWidth="1px" NextPrevFormat="FullMonth" BackColor="White" Width="844px"
ForeColor="Black" Height="190px" Font-Size="9pt" Font-Names="Verdana" BorderColor="White">
<TodayDayStyle backcolor="#CCCCCC"></TodayDayStyle>
<DayStyle horizontalalign="Left" verticalalign="Top"></DayStyle>
<NextPrevStyle font-size="8pt" font-bold="True" forecolor="#333333" verticalalign="Bottom"></NextPrevStyle>
<DayHeaderStyle font-size="8pt" font-bold="True" horizontalalign="Left" verticalalign="Top"></DayHeaderStyle>
<SelectedDayStyle forecolor="White" backcolor="#333399"></SelectedDayStyle>
<TitleStyle font-size="12pt" font-bold="True" borderwidth="4px" forecolor="#333399"
bordercolor="Black" backcolor="White"></TitleStyle>
<WeekendDayStyle backcolor="#FFE0C0"></WeekendDayStyle>
<OtherMonthDayStyle forecolor="#999999"></OtherMonthDayStyle>
</asp:calendar></P>
<P>
<asp:Label id="lblValgtDato" runat="server"></asp:Label></P>
<P>
<asp:panel id="AftalePanel" runat="server">
<asp:repeater id="AftaleRepeater" runat="server">
<HeaderTemplate>
<p align="left">
<table border="1" width="100%">
<table style="color:Black;border collapse:collapse;">
<tr style="color:Black;font-weight:bold;">
<td>
<b>Aftale</b></td>
<td>
<b>Detaljer</b></td>
<td>
<b>Start</b></td>
<td>
<b>Slut</b></td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr style="background-color:White;">
<td>
<%# DataBinder.Eval(Container.DataItem, "KortBeskrivelse") %>
</td>
<td>
<%# DataBinder.Eval(Container.DataItem, "LangBeskrivelse")%>
</td>
<td>
<%# DataBinder.Eval(Container.DataItem, "StartTid") %>
</td>
<td>
<%# DataBinder.Eval(Container.DataItem, "SlutTid") %>
</td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr style="background-color:Gainsboro;">
<td>
<%# DataBinder.Eval(Container.DataItem, "KortBeskrivelse") %>
</td>
<td>
<%# DataBinder.Eval(Container.DataItem, "LangBeskrivelse")%>
</td>
<td>
<%# DataBinder.Eval(Container.DataItem, "StartTid") %>
</td>
<td>
<%# DataBinder.Eval(Container.DataItem, "SlutTid") %>
</td>
</tr>
</AlternatingItemTemplate>
<FooterTemplate>
</table>
</P>
</FooterTemplate> </asp:repeater></asp:panel></P>
<P>
<asp:Button id="cmdOpretAftale" runat="server" Text="Opret aftale"></asp:Button></P>
<P>
<asp:Panel id="OpretAftalePanel" runat="server" Visible="False">
<TABLE border="0">
<TR>
<TD vAlign="top">Dato</TD>
<TD vAlign="top">
<asp:TextBox id="txtStartDato" runat="server"></asp:TextBox> kl.</TD>
<TD vAlign="top">
<asp:TextBox id="txtStartTid" runat="server"></asp:TextBox>
<P></P>
</TD>
</TR>
<TR>
<TD vAlign="top">Slut dato:</TD>
<TD vAlign="top">
<asp:TextBox id="txtSlutDato" runat="server"></asp:TextBox> kl.</TD>
<TD vAlign="top">
<asp:TextBox id="txtSlutTid" runat="server"></asp:TextBox>
<P></P>
</TD>
</TR>
<TR>
<TD vAlign="top">Aftale:</TD>
<TD vAlign="top" colSpan="2">
<asp:TextBox id="txtNavn" runat="server"></asp:TextBox>
<P></P>
</TD>
</TR>
<TR>
<TD vAlign="top">Detaljer:</TD>
<TD vAlign="top" colSpan="2">
<asp:TextBox id="txtKommentar" runat="server"></asp:TextBox></TD>
</TR>
</TABLE>
<asp:Button id="cmdOpret" runat="server" Text="Opret!"></asp:Button>
<asp:Button id="cmdFortryd" runat="server" Text="Fortryd"></asp:Button>
</asp:Panel></P>
</form>
</body>
</HTML>
Dernæst kodedelen.
Bemærk, at det er skrevet i Visual Studio .NET, men det skulle være en overkommelig opgave, at skrive det over i web-matrix
Imports System.Data
Imports System.IO
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not Page.IsPostBack Then
Kalender.SelectedDate = Today()
VisKalenderIndhold()
End If
End Sub
Protected Sub VisKalenderIndhold()
Dim dataSet As dataSet = IndlaesKalenderData()
If dataSet Is Nothing Then
Exit Sub
End If
' Bind data til repeater kontrollen
Dim DagensData As dataSet
DagensData = HentDagensAftaler(dataSet, Kalender.SelectedDate)
AftaleRepeater.DataSource = DagensData
AftaleRepeater.DataBind()
If (DagensData.Tables(0).Rows.Count > 0) Then
AftalePanel.Visible = True
lblValgtDato.Text = "Detaljer for " + Kalender.SelectedDate.ToLongDateString() + ":"
Else
AftalePanel.Visible = False
lblValgtDato.Text = "Der er ingen aftaler den " + Kalender.SelectedDate.ToLongDateString()
End If
End Sub
Protected Function IndlaesKalenderData() As DataSet
Dim sourceXML As String = Server.MapPath("/db/kalender.xml")
If (Not File.Exists(sourceXML)) Then
Return Nothing
End If
Dim cachedDataSet As dataSet = Session("KalenderData")
If (Not cachedDataSet Is Nothing) Then
Return cachedDataSet
End If
Dim dataSet As dataSet = New dataSet()
Try
dataSet.ReadXml(sourceXML)
Session("KalenderData") = dataSet
Catch e As Exception
lblValgtDato.Text = e.Message
dataSet = Nothing
End Try
Return dataSet
End Function
Private Sub Kalender_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Kalender.DayRender
Dim dataSet As dataSet = IndlaesKalenderData()
If dataSet Is Nothing Then
Exit Sub
End If
Dim DagensAftaler As dataSet
DagensAftaler = HentDagensAftaler(dataSet, e.Day.Date)
' Vis dagens aftaler, hvis der er nogen
Dim Aftale As DataRow
For Each Aftale In DagensAftaler.Tables(0).Rows
Dim AftaleLabel As New System.Web.UI.WebControls.Label()
AftaleLabel.Text = "<br />" + Aftale.Item("KortBeskrivelse")
e.Cell.Controls.Add(AftaleLabel)
Next
End Sub
Private Function HentDagensAftaler(ByVal AlleData As DataSet, ByVal DagensDato As DateTime) As DataSet
' Hjælper med at finde aftaler for den givne dato
Dim Betingelse As String
Betingelse = String.Format("Dato = '{0}'", DagensDato.ToString("yyyy/MM/dd"))
Dim Aftaler() As DataRow = AlleData.Tables(0).Select(Betingelse)
Dim AlleAftaler As DataSet = AlleData.Clone()
' build only the rows that match this date...
Dim Aftale As DataRow
For Each Aftale In Aftaler
AlleAftaler.Tables(0).ImportRow(Aftale)
Next
Return AlleAftaler
End Function
Private Function FindSikkerDato(ByVal ForeslaaetDato As String) As DateTime
' Returnerer en sikker dato
Dim SikkerDato As DateTime = DateTime.MinValue
Try
SikkerDato = DateTime.Parse(ForeslaaetDato)
Catch e As Exception
Response.Write("<!-- FEJL i tolkning af dato: " + e.Message + " -->")
End Try
Return SikkerDato
End Function
Private Sub Kalender_SelectionChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Kalender.SelectionChanged
VisKalenderIndhold()
End Sub
Private Sub cmdOpretAftale_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOpretAftale.Click
OpretAftalePanel.Visible = True
cmdOpretAftale.Enabled = False
If Kalender.SelectedDates.Count = 1 Then
txtStartDato.Text = Kalender.SelectedDate.ToShortDateString
txtSlutDato.Text = Kalender.SelectedDate.ToShortDateString
txtStartTid.Text = "9:00"
txtSlutTid.Text = "16:00"
Else
txtStartDato.Text = Kalender.SelectedDates.Item(0).ToShortDateString
txtStartTid.Text = "9:00"
txtSlutDato.Text = Kalender.SelectedDates.Item(Kalender.SelectedDates.Count - 1).ToShortDateString
txtSlutTid.Text = "16:00"
End If
End Sub
Private Sub cmdOpret_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdOpret.Click
Dim dataSet As dataSet = IndlaesKalenderData()
Dim dtStart, dtSlut As DateTime
Dim i As Integer
dtStart = FindSikkerDato(txtStartDato.Text)
dtSlut = FindSikkerDato(txtSlutDato.Text)
Dim objTable As DataTable
objTable = dataSet.Tables(0)
For i = 0 To dtSlut.Subtract(dtStart).Days
Dim objRow As DataRow
'Ny rkke
objRow = objTable.NewRow()
objRow.Item(0) = txtNavn.Text
objRow.Item(1) = txtKommentar.Text
objRow.Item(2) = dtStart.AddDays(i).ToString("yyyy-MM-dd")
If i = 0 Then
objRow.Item(3) = txtStartTid.Text
Else
objRow.Item(3) = "8:00"
End If
If i = dtSlut.Subtract(dtStart).Days Then
objRow.Item(4) = txtSlutTid.Text
Else
objRow.Item(4) = "18:00"
End If
objTable.Rows.Add(objRow)
Next
dataSet.WriteXml(Server.MapPath("/db/kalender.xml"))
OpretAftalePanel.Visible = False
cmdOpretAftale.Enabled = True
Session("KalenderData") = dataSet
VisKalenderIndhold()
End Sub
Private Sub cmdFortryd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFortryd.Click
OpretAftalePanel.Visible = False
cmdOpretAftale.Enabled = True
End Sub
Og datagrundlaget
Et lille xml dokument med denne struktur:
<?xml version="1.0" standalone="yes"?>
<Kalender>
<Aftale>
<KortBeskrivelse></KortBeskrivelse>
<LangBeskrivelse></LangBeskrivelse>
<Dato></Dato>
<StartTid></StartTid>
<SlutTid></SlutTid>
</Aftale>
</Kalender>
File up og download:
http://www.ondotnet.com/pub/a/dotnet/2002/04/01/asp.html