Modifica dei dati mediante un controllo server Web DetailsView
Aggiornamento: novembre 2007
Nel controllo DetailsView è incorporata una funzionalità che può essere utilizzata per consentire agli utenti di modificare o eliminare record senza che sia necessario scrivere codice. È possibile personalizzare la funzionalità di modifica del controllo DetailsView utilizzando eventi e modelli.
Attivazione della funzionalità di modifica incorporata
È possibile attivare la funzionalità incorporata di modifica del controllo DetailsView impostando una o più proprietà AutoGenerateEditButton, AutoGenerateInsertButton e AutoGenerateDeleteButton su true. Il controllo DetailsView aggiungerà la funzionalità automaticamente per consentire agli utenti di modificare o eliminare il record associato corrente e inserire un nuovo record, purché l'origine dati per il controllo DetailsView supporti le modifiche.
Modifiche applicate dal controllo DetailsView ai dati associati
Il controllo DetailsView fornisce un'interfaccia che consente agli utenti di modificare i contenuti di un record associato. In una visualizzazione modificabile è in genere presente una riga aggiuntiva con pulsanti di comando contrassegnati dal testo Modifica, Inserisci ed Elimina. Per impostazione predefinita, la riga viene inserita nella parte inferiore del controllo DetailsView.
Quando l'utente fa clic su un pulsante di comando, nel controllo DetailsView viene visualizzata nuovamente la riga con i controlli che consentono agli utenti di modificare il contenuto della riga stessa. Il pulsante di modifica viene sostituito dai pulsanti che l'utente può utilizzare per salvare o annullare le modifiche apportate a una riga. Il controllo DetailsView utilizza caselle di testo per esporre i dati contenuti in un oggetto BoundField e i dati che vengono visualizzati automaticamente quando la proprietà AutoGenerateRows è impostata su true. I dati di tipo boolean vengono visualizzati in caselle di controllo. È possibile personalizzare il controllo di input visualizzato in modalità di modifica utilizzando un oggetto TemplateField. Per ulteriori informazioni, vedere Creazione di una riga personalizzata in un controllo server Web DetailsView.
Durante le operazioni di inserimento, il controllo DetailsView passa i valori da inserire nell'origine dati tramite un insieme di dizionari Values.
Per un'operazione di aggiornamento o eliminazione, il controllo DetailsView passa i valori all'origine dati in tre insiemi di dizionari, ovvero Keys, NewValues e OldValues. È possibile accedere a ciascuno di questi dizionari utilizzando gli argomenti di evento passati all'evento di inserimento, aggiornamento o eliminazione generato dal controllo DetailsView.
Nel dizionario Keys sono contenuti i nomi e i valori dei campi che identificano in modo univoco il record da aggiornare o eliminare, nonché i valori originali dei campi chiave precedenti la modifica del record. Per specificare i campi da inserire nel dizionario Keys, impostare la proprietà DataKeyNames su un elenco di nomi di campo separati da virgole, che rappresentano la chiave primaria dei dati. Nell'insieme Keys vengono automaticamente inseriti i valori associati ai campi specificati per la proprietà DataKeyNames.
Nota: |
---|
I valori originali della chiave primaria relativi ai campi specificati nella proprietà DataKeyNames vengono archiviati nello stato di visualizzazione. Se i valori della chiave primaria contengono informazioni riservate, si consiglia di crittografare il contenuto dello stato di visualizzazione impostando la proprietà ViewStateEncryptionMode della pagina su Always. |
I dizionari Values e NewValues contengono i valori correnti dei controlli di input presenti rispettivamente nel record inserito o modificato. Il dizionario OldValues contiene tutti i valori originali dei campi, tranne quelli delle chiavi, che sono inclusi nel dizionario Keys . I nuovi valori dei campi chiave vengono memorizzati nel dizionario NewValues.
I valori presenti nei dizionari Keys, Values, NewValues e OldValues vengono utilizzati come parametri per il comando di inserimento, aggiornamento o eliminazione del controllo origine dati. Per informazioni sulla modalità di creazione dei parametri di controllo origine dati in base ai dizionari creati per i valori associati, vedere Come un controllo origine dati crea parametri per campi associati a dati.
Dopo un aggiornamento, il controllo DetailsView genera l'evento ItemUpdated relativo, che consente di eseguire operazioni di logica di post-aggiornamento, ad esempio le verifiche dell'integrità. Analogamente, il controllo DetailsView genera i relativi eventi ItemInserted e ItemDeleted rispettivamente dopo un'operazione di inserimento e dopo un'operazione di eliminazione.
Una volta completato l'aggiornamento e generati tutti gli eventi, il controllo DetailsView viene nuovamente associato al controllo origine dati per visualizzare i dati aggiornati.
Personalizzazione dell'interfaccia utente di modifica nel controllo DetailsView
Per impostazione predefinita, il controllo DetailsView genera automaticamente una riga per ogni campo associato dall'origine dati. È possibile scegliere i campi da associare al controllo DetailsView impostando la proprietà AutoGenerateRows su false e specificando un controllo BoundField per ogni campo che si desidera visualizzare nel controllo DetailsView.
Per personalizzare la modalità di visualizzazione dei pulsanti di comando, impostare la proprietà AutoGenerateEditButton del controllo DetailsView su false, quindi aggiungere singoli oggetti CommandField per una riga. Ad esempio, per inserire la riga visualizzata corrente in modalità di modifica, è possibile aggiungere un campo CommandField con la proprietà ShowEditButton impostata su true.
È possibile specificare se un campo associato è modificabile utilizzando la proprietà ReadOnly del controllo BoundField. Se la proprietà ReadOnly è impostata su false, il campo potrà essere modificato quando l'utente fa clic sul pulsante di comando Modifica. Quando la proprietà ReadOnly è impostata su true, il campo associato verrà visualizzato, ma non potrà essere modificato dall'utente.
Analogamente, è possibile specificare se può essere inserito un valore per il campo associato utilizzando la proprietà InsertVisible del controllo BoundField. Se la proprietà InsertVisible è false, il campo associato non verrà visualizzato quando l'utente fa clic sul pulsante di comando Nuovo. Questa impostazione risulta utile quando il campo associato, ad esempio un indicatore di data e ora o una chiave primaria con incremento automatico, viene generato dall'origine dati automaticamente.
Esempio
Nel codice di esempio seguente vengono utilizzati un controllo GridView e un controllo DetailsView per la visualizzazione dei dati. Il controllo DetailsView è configurato in modo da consentire le modifiche dei dati.
<%@ 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>