Изменение данных с помощью серверного веб-элемент управления DetailsView
Обновлен: Ноябрь 2007
Элемент управления DetailsView имеет встроенные функциональные возможности, позволяющие предоставить пользователям разрешение на изменение или удаление записей, не создавая программный код. Можно настроить функциональные возможности редактирования элемента управления DetailsView с помощью событий и шаблонов.
Включение встроенных функциональных возможностей редактирования
Можно включить встроенные функциональные возможности редактирования элемента управления DetailsView, присвоив одному или нескольким свойствам AutoGenerateEditButton, AutoGenerateInsertButton и AutoGenerateDeleteButton значение true. Элемент управления DetailsView автоматически добавляет функциональные возможности, позволяющие пользователям редактировать или удалять текущую связанную запись и вставлять новую запись при условии, что источник данных для элемента управления DetailsView поддерживает редактирование.
Использование элемента управления DetailsView для изменения связанных данных
Элемент управления DetailsView предоставляет пользовательский интерфейс, позволяющий пользователям изменять содержимое связанной записи. Как правило, если представление можно редактировать, в нем отображается дополнительная строка, содержащая кнопки с текстом Правка, Вставить и Удалить. По умолчанию эта строка добавляется в нижней части элемента управления DetailsView.
При нажатии кнопки элемент управления DetailsView повторно отображает строку с элементами управления, позволяющими пользователям изменять содержимое строки. Кнопка редактирования заменяется кнопкой, которая позволяет пользователю сохранить изменения или отменить редактирование строки. В элементе управления DetailsView используются текстовые поля для отображения данных в BoundField и для данных, отображаемых автоматически при присвоении свойству AutoGenerateRows значения true. Логические данные отображаются с помощью флажков. Можно настроить элемент управления вводом, отображаемый в режиме редактирования, с помощью TemplateField. Дополнительные сведения см. в разделе Создание настраиваемой строки в серверном веб-элементе управления DetailsView.
При выполнении операции вставки с помощью элемента управления DetailsView он передает значения, которые следует вставить в источник данных, используя коллекцию словаря Values.
При выполнении операции обновления или удаления элемент управления DetailsView передает значения в источник данных в трех коллекциях словаря: Keys, NewValues и OldValues. Можно получить доступ к каждому словарю, используя аргументы события, переданные событиям вставки, обновления или удаления, вызванным элементом управления DetailsView.
Словарь Keys содержит имена и значения полей, которые уникально идентифицируют обновляемую или удаляемую запись. Он всегда содержит исходные значения ключевых полей перед редактированием записи. Чтобы указать, какие поля следует поместить в словарь Keys, укажите в качестве значения свойства DataKeyNames разделенный запятыми список имен полей, которые представляют собой первичный ключ данных. Коллекция Keys автоматически заполняется значениями, связанными с полями, указанными для свойства DataKeyNames.
Примечание. |
---|
Исходные значения первичных ключей полей, указанные в свойстве DataKeyNames, хранятся в состоянии просмотра. Если значения первичного ключа содержат конфиденциальные сведения, то необходимо шифровать содержимое состояния просмотра, присвоив свойству ViewStateEncryptionMode страницы значение Always. |
Словари Values и NewValues содержат текущие значения из элементов управления вводом во вставляемой или изменяемой записи соответственно. Словарь OldValues содержит все исходные значения полей за исключением ключевых полей, которые включены в словарь Keys. Новые значения для ключевых полей включаются в словарь NewValues.
Элемент управления источником данных использует значения из словарей Keys, Values, NewValues и OldValues в качестве параметров для команд вставки, обновления или удаления. Сведения о создании параметров элемента управления источником данных на основе словарей, созданных для связанных значений, см. в разделе Создание параметров для полей, привязанных к данным, элементом управления источником данных.
После обновления элемент управления DetailsView вызывает событие ItemUpdated. Это событие позволяет выполнять действия, следующие за обновлением, например, проверить целостность. Аналогичным образом элемент управления DetailsView вызывает событие ItemInserted после выполнения вставки и событие ItemDeleted после выполнения удаления.
После завершения обновления и вызова всех событий элемент управления DetailsView повторно связывается с элементом управления источником данных для отображения обновленных данных.
Настройка пользовательского интерфейса редактирования в элементе управления DetailsView
По умолчанию элемент управления DetailsView автоматически создает по одной строке для каждого связанного поля из источника данных. Можно настроить, какие поля связываются с элементом управления DetailsView, присвоив свойству AutoGenerateRows значение false и указав элемент управления BoundField для каждого поля, которое необходимо отобразить в элементе управления DetailsView.
Чтобы настроить способ отображения кнопок, можно присвоить свойству AutoGenerateEditButton элемента управления DetailsView значение false. Затем можно добавить отдельные объекты CommandField для строки. Например, чтобы перевести текущую отображаемую строку в режим редактирования, можно добавить поле CommandField, присвоив свойству ShowEditButton значение true.
Можно указать, доступно ли связанное поле для редактирования, используя свойство ReadOnly элемента управления BoundField. Если свойству ReadOnly присвоено значение false, то поле будет доступно для редактирования, когда пользователь нажимает кнопку Правка. Когда свойству ReadOnly присвоено значение true, связанное поле отображается, но пользователь не может его редактировать.
Аналогичным образом можно задать возможность вставки значений в связанное поле, используя свойство InsertVisible элемента управления BoundField. Если свойству InsertVisible присвоено значение false, то связанное поле не отображается при нажатии пользователем кнопки Создать. Это особенно удобно, когда связанное поле автоматически создается источником данных (например, штамп даты и времени или автоматическое увеличение первичного ключа).
Пример
В следующем примере кода используются элементы управления GridView и DetailsView для отображения данных. Элемент управления DetailsView настроен таким образом, чтобы разрешить изменение данных.
<%@ Page language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
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 runat="server">
<title>Northwind Employees</title>
</head>
<body>
<form id="form1" runat="server">
<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 runat="server">
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 runat="server">
<title>Northwind Employees</title>
</head>
<body>
<form id="form1" runat="server">
<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>
См. также
Ссылки
Общие сведения о серверном веб-элементе управления DetailsView