Das DataList-Objekt kann man nicht nur zum Visualisieren von Daten verwenden, sondern die angezeigten Daten lassen sich auch veändern.
Hier ein kleines, vereinfachtes Beispiel aus der Warenkorb-Funktion eines Shop-Systems. Die ausgewählten Artikel werden im Warenkorb angezeigt und die Anzahl soll verändert werden können.
Beschreibung des Skriptes:
Per DataReader wird der Inhalt des Warenkorbes ausgelesen und mittels eines DataList-Objektes angezeigt.
Die Editmaske wird im <EditItemTemplate> Bereich definiert. Hier wird die Anzahl in einem HTML Server-Control zum ändern angezeigt. Damit wir für den Datenbank-Update die entsprechende ID haben, wird diese in einem Hidden-Field mitgeführt.
Im ASP:DataList -Tag definieren wir die Events die wir benötigen:
<ASP:DataList id="DataList" OnEditCommand="DataList_Edit" OnUpdateCommand="DataList_Update" OnCancelCommand="DataList_Cancel" runat="server">
In den Linkbuttons werden per CommandNames die Events, die ausgelöst werden sollen, festgelegt.
In der Warenkorbansicht wird über den Link "bearbeiten" der Editmodus dieser Zeile aufgerufen und die Anzahl kann geändert werden. Mit dem Link "speichern" wird über das Event "Update" die Updare-Prozedur aufgerufen welche die Werte ID und Anzahl einliest und die Datenbank updated.
<%
@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<
html>
<script language="VB" runat="server">
Sub liste_erstellen()
Dim strConnect, strSQL As String
strConnect = System.Configuration.ConfigurationManager.AppSettings.Get("myConnection")
strSQL = "select id, kurztext, anzahl, preis , anzahl*preis as summe from kaufhaus_warenkorb"
Dim DBConnection As New OleDbConnection
DBConnection.ConnectionString = strConnect
Dim ObjDbCommand As New OleDbCommand(strSQL, DBConnection)
Dim daten As OleDbDataReader
DBConnection.Open()
daten = ObjDbCommand.ExecuteReader()
DataList.DataSource = Daten
DataList.DataBind()
DBConnection.Close()
End Sub
Sub Page_Load(Sender As Object, E As EventArgs)
If Not (Page.IsPostBack)
liste_erstellen()
End If
End Sub
Sub DataList_Edit(Sender As Object, E As DataListCommandEventArgs)
DataList.EditItemIndex = CInt(e.Item.ItemIndex)
liste_erstellen()
End Sub
Sub DataList_Update(Sender As Object, E As DataListCommandEventArgs)
Dim EditText As HtmlInputText
Dim EditId As HtmlInputHidden
EditText = E.Item.FindControl("edit_anzahl")
EditId = E.Item.FindControl("edit_id")
Dim strConnect, strSQL As String
strConnect = System.Configuration.ConfigurationManager.AppSettings.Get("myConnection")
strSQL = "update kaufhaus_warenkorb set anzahl = " & EditText.Value & " where id=" & EditId.Value
Dim DBConnection As New OleDbConnection
DBConnection.ConnectionString = strConnect
Dim ObjDbCommand As New OleDbCommand(strSQL, DBConnection)
DBConnection.Open()
ObjDbCommand.ExecuteNonQuery()
DBConnection.Close()
Nachricht.Text = "Anzahl ge„ndert auf: " & EditText.Value
DataList.EditItemIndex = -1
liste_erstellen()
End Sub
Sub DataList_Cancel(Sender As Object, E As DataListCommandEventArgs)
Nachricht.Text = "keine Žnderung"
DataList.EditItemIndex = -1
liste_erstellen()
End Sub
Function formatEur(ByVal wert As String)
formatEur = String.Format("{0:c}", Decimal.Parse(wert))
End Function
</
script>
<
body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0">
<form id="Form1" runat="server">
<ASP:DataList id="DataList" OnEditCommand="DataList_Edit" OnUpdateCommand="DataList_Update" OnCancelCommand="DataList_Cancel" runat="server">
<HeaderTemplate>
<table border="0">
<tr><td> </td><td>Anzahl</td><td>Artikel</td><td align="right">Preis/Stk.</td><td align="right">Summe</td></tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td width="130px" height="30">
<asp:linkbutton ID="Linkbutton4" CommandName="Edit" runat="server">bearbeiten</asp:linkbutton>
</td>
<td align="right"><%#Eval("anzahl")%></td>
<td><%#Eval("kurztext")%> </td>
<td align="right"><%#formatEur(Eval("preis"))%></td>
<td align="right"><%#formatEur(Eval("summe"))%></td>
</tr>
</ItemTemplate>
<EditItemTemplate>
<tr>
<td width="130px" height="30">
<asp:linkbutton ID="Linkbutton1" CommandName="Update" runat="server">speichern</asp:linkbutton>
<asp:linkbutton ID="Linkbutton5" CommandName="Cancel" runat="server">abbrechen</asp:linkbutton>
</td>
<td>
<input id="edit_anzahl" style="width:40" type="text" value='<%#eval("anzahl")%>' runat="server"/>
<input id="edit_id" type="hidden" value='<%#eval("id")%>' runat="server"/>
</td>
<td><%#Eval("kurztext")%> </td>
<td align="right"><%#formatEur(Eval("preis"))%></td>
<td align="right"><%#formatEur(Eval("summe"))%></td>
<td></td>
</tr>
</EditItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</ASP:DataList>
</form>
<asp:Label ID="Nachricht" runat="server" Text="Label"></asp:Label>
</body>
</html>