Ändern von Daten mithilfe eines DetailsView-Webserversteuerelements
Aktualisiert: November 2007
Das DetailsView-Steuerelement enthält integrierte Funktionen, mit denen Benutzer Datensätze schreiben oder löschen können, ohne dass eine Programmierung erforderlich ist. Sie können die Bearbeitungsfunktionalität des DetailsView-Steuerelements mittels Ereignissen und Vorlagen anpassen.
Aktivieren der integrierten Bearbeitungsfunktionalität
Die integrierte Bearbeitungsfunktionalität des DetailsView-Steuerelements kann aktiviert werden, indem eine oder mehrere der Eigenschaften AutoGenerateEditButton, AutoGenerateInsertButton und AutoGenerateDeleteButton auf true festgelegt werden. Das DetailsView-Steuerelement fügt automatisch die Funktionen hinzu, sodass alle Benutzer aktuell gebundene Datensätze bearbeiten bzw. löschen und neue Datensätze einfügen können, vorausgesetzt die Datenquelle des DetailsView-Steuerelements unterstützt die Bearbeitungsoption.
Ändern gebundener Daten mit dem DetailsView-Steuerelement
Das DetailsView-Steuerelement bietet eine Benutzeroberfläche, mit der Benutzer die Inhalte eines gebundenen Datensatzes ändern können. In einer bearbeitbaren Ansicht wird in der Regel eine zusätzliche Zeile angezeigt, die die Befehlsschaltflächen Bearbeiten, Einfügen und Löschen enthält. Standardmäßig wird diese Zeile am unteren Rand des DetailsView-Steuerelements eingefügt.
Wenn ein Benutzer auf eine Befehlsschaltfläche klickt, zeigt das DetailsView-Steuerelement erneut die Zeile mit den Steuerelementen zur Änderung des Zeileninhalts an. Die Schaltfläche Bearbeiten wird durch Schaltflächen ersetzt, mit denen der Benutzer die Bearbeitung einer Zeile speichern oder abbrechen kann. Über Textfelder zeigt das DetailsView-Steuerelement Daten in einem BoundField an. Wenn die AutoGenerateRows-Eigenschaft auf true festgelegt ist, verwendet es ebenfalls Textfelder für die automatische Anzeige von Daten. Boolesche Daten werden mit Kontrollkästchen angezeigt. Sie können das im Bearbeitungsmodus angezeigte Eingabesteuerelement mit TemplateField anpassen. Weitere Informationen finden Sie unter Erstellen einer benutzerdefinierten Zeile in einem DetailsView-Webserversteuerelement.
Führt das DetailsView-Steuerelement einen Einfügevorgang durch, übergibt es die in die Datenquelle einzufügenden Werte. Hierfür verwendet es das Values-Wörterbuch.
Bei Aktualisierungs- oder Löschoperationen übergibt das DetailsView-Steuerelement Werte an die Datenquelle in drei Wörterbuchauflistungen: das Keys-Wörterbuch, das NewValues-Wörterbuch und das OldValues-Wörterbuch. Sie können mit Ereignisargumenten auf jedes Wörterbuch zugreifen. Diese Argumente werden durch das DetailsView-Steuerelement ausgelöst und an die Ereignisse Einfügen, Aktualisieren oder Löschen weitergegeben.
Das Keys-Wörterbuch enthält die Namen und Werte der Felder, die den zu aktualisierenden oder zu löschenden Datensatz eindeutig kennzeichnen. Außerdem enthält es immer die ursprünglichen Werte des Schlüsselfelds vor Bearbeitung des Datensatzes. Die Felder, die in das Keys-Wörterbuch einzufügen sind, bestimmen Sie über das Festlegen der DataKeyNames-Eigenschaft auf eine durch Kommas getrennte Liste mit Feldnamen. Diese Liste repräsentiert den Primärschlüssel der Daten. Die Keys-Auflistung wird automatisch mit den Werten gefüllt, die den unter der DataKeyNames-Eigenschaft angegebenen Feldern zugeordnet sind.
Hinweis: |
---|
Die Werte der ursprünglichen Primärschlüssel für Felder, die in der DataKeyNames-Eigenschaft festgelegt sind, werden im Ansichtszustand gespeichert. Enthalten die Primärschlüsselwerte vertrauliche Informationen, sind die Inhalte des Ansichtszustands der Seite zu verschlüsseln. Legen Sie dazu die ViewStateEncryptionMode-Eigenschaft der Seite auf Always fest. |
Das Values-Wörterbuch und das NewValues-Wörterbuch enthalten im Datensatz die eingefügten bzw. bearbeiteten aktuellen Werte aus den Eingabesteuerelementen. Das OldValues-Wörterbuch enthält alle ursprünglichen Werte der Felder, mit Ausnahme der Schlüsselfelder. Diese sind im Keys -Wörterbuch enthalten. Neue Werte für Schlüsselfelder werden in das NewValues-Wörterbuch aufgenommen.
Das Datenquellensteuerelement nutzt die Werte aus dem Keys-Wörterbuch, dem Values-Wörterbuch, dem NewValues-Wörterbuch und dem OldValues-Wörterbuch als Parameter für die Befehle Einfügen, Aktualisieren oder Löschen. Informationen zum Erstellen von Parametern für Datenquellensteuerelemente auf Grundlage der für gebundene Werte erstellten Wörterbücher finden Sie unter Erstellen von Parametern für datengebundene Felder durch ein Datenquellensteuerelement.
Nach einer Aktualisierung löst das DetailsView-Steuerelement sein ItemUpdated-Ereignis aus. Mit diesem Ereignis können Sie eine Logik nach Abschluss der Aktualisierung ausführen, z. B. Integritätsprüfungen. Entsprechend löst das DetailsView-Steuerelement nach einer Einfügung das ItemInserted-Ereignis und nach einem Löschvorgang das ItemDeleted-Ereignis aus.
Nachdem die Aktualisierung abgeschlossen wurde und alle Ereignisse ausgelöst wurden, bindet sich das DetailsView-Steuerelement zum Anzeigen der aktualisierten Daten erneut an das Datenquellensteuerelement.
Anpassen der Bearbeitungsbenutzeroberfläche im DetailsView-Steuerelement
Standardmäßig generiert das DetailsView-Steuerelement für jedes gebundene Feld in der Datenquelle eine Zeile. Sie können die Felder anpassen, die an das DetailsView-Steuerelement gebunden werden sollen. Dazu ist die AutoGenerateRows-Eigenschaft auf false festzulegen. Außerdem ist ein BoundField-Steuerelement für jedes im DetailsView-Steuerelement anzuzeigende Feld anzugeben.
Zum Anpassen der Anzeige von Befehlsschaltflächen können Sie die AutoGenerateEditButton-Eigenschaft des DetailsView-Steuerelements auf false festlegen. Sie können dann einzelne CommandField-Objekte einer Zeile hinzufügen. Beispielsweise können Sie die aktuell angezeigte Zeile in den Bearbeitungsmodus versetzen, indem Sie ein CommandField-Feld hinzufügen, dessen ShowEditButton-Eigenschaft auf true festgelegt ist.
Mithilfe der ReadOnly-Eigenschaft des BoundField-Steuerelements können Sie angeben, ob ein gebundenes Feld bearbeitet werden kann. Ist die ReadOnly-Eigenschaft auf false festgelegt, kann das Feld bearbeitet werden, wenn der Benutzer auf die Befehlsschaltfläche Bearbeiten klickt. Ist die ReadOnly-Eigenschaft true, wird zwar das gebundene Feld angezeigt, kann aber nicht bearbeitet werden.
Entsprechend können Sie mit der InsertVisible-Eigenschaft des BoundField-Steuerelements angeben, ob ein Wert in ein gebundenes Feld eingefügt werden kann. Wenn die InsertVisible-Eigenschaft auf false festgelegt ist und der Benutzer auf die Befehlsschaltfläche Neu klickt, wird das gebundene Feld nicht angezeigt. Hilfreich ist dies besonders bei gebundenen Feldern, die automatisch durch die Datenquelle generiert werden, z. B. Datums-/Uhrzeitangaben oder ein sich automatisch erhöhender Primärschlüssel.
Beispiel
Im folgenden Codebeispiel werden ein GridView-Steuerelement und ein DetailsView-Steuerelement verwendet, um Daten anzuzeigen. Das DetailsView-Steuerelement ist so konfiguriert, dass Daten geändert werden können.
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
Sub EmployeesDropDownList_OnSelectedIndexChanged(sender As Object, e As EventArgs)
EmployeeDetailsView.DataBind()
End Sub
Sub EmployeeDetailsView_ItemUpdated(sender As Object, e As DetailsViewUpdatedEventArgs)
EmployeesDropDownList.DataBind()
EmployeesDropDownList.SelectedValue = e.Keys("EmployeeID").ToString()
EmployeeDetailsView.DataBind()
End Sub
Sub EmployeeDetailsView_ItemDeleted(sender As Object, e As DetailsViewDeletedEventArgs)
EmployeesDropDownList.DataBind()
End Sub
Sub EmployeeDetailsSqlDataSource_OnInserted(sender As Object, e As SqlDataSourceStatusEventArgs)
Dim command As System.Data.Common.DbCommand = e.Command
EmployeesDropDownList.DataBind()
EmployeesDropDownList.SelectedValue = _
command.Parameters("@EmpID").Value.ToString()
EmployeeDetailsView.DataBind()
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>Northwind Employees</title>
</head>
<body>
<form id="form1" >
<h3>Northwind Employees</h3>
<table cellspacing="10">
<tr>
<td valign="top">
<asp:DropDownList ID="EmployeesDropDownList"
DataSourceID="EmployeesSqlDataSource"
DataValueField="EmployeeID"
DataTextField="FullName"
AutoPostBack="True"
OnSelectedIndexChanged="EmployeesDropDownList_OnSelectedIndexChanged"
RunAt="Server" />
</td>
<td valign="top">
<asp:DetailsView ID="EmployeeDetailsView"
DataSourceID="EmployeeDetailsSqlDataSource"
AutoGenerateRows="false"
AutoGenerateInsertbutton="true"
AutoGenerateEditbutton="true"
AutoGenerateDeletebutton="true"
DataKeyNames="EmployeeID"
Gridlines="Both"
OnItemUpdated="EmployeeDetailsView_ItemUpdated"
OnItemDeleted="EmployeeDetailsView_ItemDeleted"
RunAt="server">
<HeaderStyle backcolor="Navy"
forecolor="White"/>
<RowStyle backcolor="White"/>
<AlternatingRowStyle backcolor="LightGray"/>
<EditRowStyle backcolor="LightCyan"/>
<Fields>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>
<asp:BoundField DataField="FirstName" HeaderText="First Name"/>
<asp:BoundField DataField="LastName" HeaderText="Last Name"/>
<asp:BoundField DataField="Address" HeaderText="Address"/>
<asp:BoundField DataField="City" HeaderText="City"/>
<asp:BoundField DataField="Region" HeaderText="Region"/>
<asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/>
</Fields>
</asp:DetailsView>
</td>
</tr>
</table>
<asp:SqlDataSource ID="EmployeesSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName AS FullName FROM Employees"
Connectionstring="<%$ ConnectionStrings:NorthwindConnection %>"
RunAt="server">
</asp:SqlDataSource>
<asp:SqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode
FROM Employees WHERE EmployeeID = @EmpID"
InsertCommand="INSERT INTO Employees(LastName, FirstName, Address, City, Region, PostalCode)
VALUES (@LastName, @FirstName, @Address, @City, @Region, @PostalCode);
SELECT @EmpID = SCOPE_IDENTITY()"
UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName, Address=@Address,
City=@City, Region=@Region, PostalCode=@PostalCode
WHERE EmployeeID=@EmployeeID"
DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
RunAt="server">
<SelectParameters>
<asp:ControlParameter ControlID="EmployeesDropDownList" PropertyName="SelectedValue"
Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter Name="FirstName" Type="String" />
<asp:Parameter Name="Address" Type="String" />
<asp:Parameter Name="City" Type="String" />
<asp:Parameter Name="Region" Type="String" />
<asp:Parameter Name="PostalCode" Type="String" />
<asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter Name="FirstName" Type="String" />
<asp:Parameter Name="Address" Type="String" />
<asp:Parameter Name="City" Type="String" />
<asp:Parameter Name="Region" Type="String" />
<asp:Parameter Name="PostalCode" Type="String" />
<asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
</UpdateParameters>
<DeleteParameters>
<asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
</DeleteParameters>
</asp:SqlDataSource>
</form>
</body>
</html>
<%@ Page language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
void EmployeesDropDownList_OnSelectedIndexChanged(Object sender, EventArgs e)
{
EmployeeDetailsView.DataBind();
}
void EmployeeDetailsView_ItemUpdated(Object sender, DetailsViewUpdatedEventArgs e)
{
EmployeesDropDownList.DataBind();
EmployeesDropDownList.SelectedValue = e.Keys["EmployeeID"].ToString();
EmployeeDetailsView.DataBind();
}
void EmployeeDetailsView_ItemDeleted(Object sender, DetailsViewDeletedEventArgs e)
{
EmployeesDropDownList.DataBind();
}
void EmployeeDetailsSqlDataSource_OnInserted(Object sender, SqlDataSourceStatusEventArgs e)
{
System.Data.Common.DbCommand command = e.Command;
EmployeesDropDownList.DataBind();
EmployeesDropDownList.SelectedValue =
command.Parameters["@EmpID"].Value.ToString();
EmployeeDetailsView.DataBind();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
<title>Northwind Employees</title>
</head>
<body>
<form id="form1" >
<h3>Northwind Employees</h3>
<table cellspacing="10">
<tr>
<td valign="top">
<asp:DropDownList ID="EmployeesDropDownList"
DataSourceID="EmployeesSqlDataSource"
DataValueField="EmployeeID"
DataTextField="FullName"
AutoPostBack="True"
OnSelectedIndexChanged="EmployeesDropDownList_OnSelectedIndexChanged"
RunAt="Server" />
</td>
<td valign="top">
<asp:DetailsView ID="EmployeeDetailsView"
DataSourceID="EmployeeDetailsSqlDataSource"
AutoGenerateRows="false"
AutoGenerateInsertbutton="true"
AutoGenerateEditbutton="true"
AutoGenerateDeletebutton="true"
DataKeyNames="EmployeeID"
Gridlines="Both"
OnItemUpdated="EmployeeDetailsView_ItemUpdated"
OnItemDeleted="EmployeeDetailsView_ItemDeleted"
RunAt="server">
<HeaderStyle backcolor="Navy"
forecolor="White"/>
<RowStyle backcolor="White"/>
<AlternatingRowStyle backcolor="LightGray"/>
<EditRowStyle backcolor="LightCyan"/>
<Fields>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" InsertVisible="False" ReadOnly="true"/>
<asp:BoundField DataField="FirstName" HeaderText="First Name"/>
<asp:BoundField DataField="LastName" HeaderText="Last Name"/>
<asp:BoundField DataField="Address" HeaderText="Address"/>
<asp:BoundField DataField="City" HeaderText="City"/>
<asp:BoundField DataField="Region" HeaderText="Region"/>
<asp:BoundField DataField="PostalCode" HeaderText="Postal Code"/>
</Fields>
</asp:DetailsView>
</td>
</tr>
</table>
<asp:SqlDataSource ID="EmployeesSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName + ', ' + FirstName AS FullName FROM Employees"
Connectionstring="<%$ ConnectionStrings:NorthwindConnection %>"
RunAt="server">
</asp:SqlDataSource>
<asp:SqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode
FROM Employees WHERE EmployeeID = @EmpID"
InsertCommand="INSERT INTO Employees(LastName, FirstName, Address, City, Region, PostalCode)
VALUES (@LastName, @FirstName, @Address, @City, @Region, @PostalCode);
SELECT @EmpID = SCOPE_IDENTITY()"
UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName, Address=@Address,
City=@City, Region=@Region, PostalCode=@PostalCode
WHERE EmployeeID=@EmployeeID"
DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
RunAt="server">
<SelectParameters>
<asp:ControlParameter ControlID="EmployeesDropDownList" PropertyName="SelectedValue"
Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter Name="FirstName" Type="String" />
<asp:Parameter Name="Address" Type="String" />
<asp:Parameter Name="City" Type="String" />
<asp:Parameter Name="Region" Type="String" />
<asp:Parameter Name="PostalCode" Type="String" />
<asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="LastName" Type="String" />
<asp:Parameter Name="FirstName" Type="String" />
<asp:Parameter Name="Address" Type="String" />
<asp:Parameter Name="City" Type="String" />
<asp:Parameter Name="Region" Type="String" />
<asp:Parameter Name="PostalCode" Type="String" />
<asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
</UpdateParameters>
<DeleteParameters>
<asp:Parameter Name="EmployeeID" Type="Int32" DefaultValue="0" />
</DeleteParameters>
</asp:SqlDataSource>
</form>
</body>
</html>