Modificando Dados Usando um Controle DetailsView do Servidor Web
The DetailsView control has built-in functionality for allowing users to edit or delete records without requiring programming.Você pode personalizar a funcionalidade de edição do controle DetailsView usando eventos e modelos.
Ativando a Funcionalidade de Edição Interna
Você pode habilitar a edição interna do controle DetailsView pela configuração de um ou mais AutoGenerateEditButton, AutoGenerateInsertButton, e AutoGenerateDeleteButton propriedades para true.O controle DetailsView vai automaticamente adicionar a funcionalidade que permite usuários editarem ou excluírem o registro atual restrito e inserir um novo registro, desde que a fonte de dados para o controle DetailsView suporte edições.
Como o Controle de Exibição de Detalhes Modifica Dados Restritos
O controle DetailsView fornece uma interface de usuário (UI) que permite usuários de modificarem os conteúdos de um registro restrito.Tipicamente, uma exibição editável mostra uma linha adicional que contém botões de comando com o texto Editar, Inserir, e Excluir.Por padrão, a linha é adicionada abaixo do controle DetailsView.
Quando o usuário clica em um botão de comando, o controle DetailsView mostra novamente a linha com controles que permitem que os usuários modifiquem os conteúdos da linha.O botão de editar é substituído por botões que permitem ao usuário salvar mudanças ou cancelar edição de uma linha.O DetailsView controle usa caixas de texto para mostrar dados em um BoundField e dados mostrados automaticamente quando a AutoGenerateRows propriedade é definida para true.Dados booleanos são mostrados usando caixas de texto.Você pode personalizar o controle de entrada mostrado no modo de edição pelo uso de um TemplateField.Para obter mais informações, consulte Criando uma linha personalizada em um controle de servidor da Web DetailsView.
Quando o controle DetailsView está executando uma operação de inserção, ele passa os valores a serem inseridos em uma fonte de dados usando a Valuescoleção de dicionário.
Para uma operação de atualização ou excluir, o DetailsView controle passa valores para a fonte de dados nas três coleções do dicionário: the Keys dicionário, o NewValues dicionário e o OldValues dicionário. Você pode acessar cada dicionário usando os argumentos de evento passados para os eventos de inserção, atualização ou exclusão invocados pelo controle DetailsView.
O dicionário Keys contém os nomes e valores dos campos que identificam exclusivamente o registro para atualizar ou excluir, e sempre contém os valores originais dos campos de chave antes que o registro seja editado.To specify which fields are placed in the Keys dictionary, set the DataKeyNames property to a comma-separated list of field names that represent the primary key of your data.A coleção Keys é automaticamente populada com os valores associados com os campos especificados para a propriedade DataKeyNames.
![]() |
---|
The original primary key values for the fields specified in the DataKeyNames property are stored in view state.If your primary key values contain sensitive information, you should encrypt the view state contents by setting the page's ViewStateEncryptionMode property to Always. |
Os dicionários Values e NewValues contêm os valores atuais dos controles de entrada no registro a ser inserido ou editado, respectivamente.The OldValues dictionary contains any original values of fields except the key fields, which are included in the Keys dictionary.Novos valores de campos de chaves são incluídos no dicionário NewValues.
O controle de fonte de dados usa os valores dos dicionários Keys, Values, NewValues e OldValues como parâmetros para o comando de inserção, atualização ou exclusão.For information on how data source control parameters are created based on the dictionaries created for bound values, see Como um Controle da Fonte de Dados Cria Parâmetros para Campos Ligados a Dados.
Depois de uma atualização, o controle DetailsView invoca seu evento ItemUpdated.Esse evento permite q vc execute lógica de pós-atualização, de modo que verifique a integridade.Semelhantemente, o controle DetailsView invoca seu evento ItemInserted depois de uma inserção e seu evento ItemDeleted depois de uma exclusão.
Após a atualização estar concluída e todos os eventos terem sido invocados, o controle DetailsView religa-se ao controle da fonte de dados para mostrar os dados atualizados.
Personalizando as Interfaces de Usuário de Edição no Controle DetailsView
Por padrão, o controle DetailsView automaticamente gera uma linha para cada campo restrito da fonte de dados.Você pode personalizar quais campos estão ligados com o controle DetailsView pela definição da propriedade AutoGenerateRows para false e especificar um controle BoundField para cada campo que você quiser mostrar no controle DetailsView.
Para personalizar como os botões de comando são mostrados, você pode definir a propriedade AutoGenerateEditButton do controle DetailsView para false.Você pode então adicionar objetos CommandField individuais para uma linha.Por exemplo, no lugar em que a atual linha mostrada dentro do modo de edição, você pode adicionar um campo CommandField com a propriedade ShowEditButton definida para true.
Você pode especificar se um campo restrito é editável usando a propriedade ReadOnly do controle BoundField.Quando a propriedade ReadOnly é definida para false, o campo será editável quando o usuário clicar no botão de comando Editar.Quando a propriedade ReadOnly é true, o campo restrito será mostrado, mas o usuário não será capaz de editar o campo.
Semelhantemente, você pode especificar se um valor pode ser inserido para um campo restrito usando a propriedade InsertVisible do controle BoundField.Se a propriedade InsertVisible é false, então o campo restrito não será mostrado quando o usuário clicar no botão de comando Novo.Isso é especialmente útil quando o campo restrito é automaticamente gerado pela fonte de dados, assim como uma data e carimbo de data/hora ou uma chave primária com autoincremento.
Exemplo
O exemplo de código seguinte usa um controle GridView e um controle DetailsView para exibir dados.O controle DetailsView é configurado para permitir que os dados sejam modificados.
<%@ 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>