Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Modifica e cancellazione

Impostare il controllo GridView per modificare o cancellare record
Impostare il controllo GridView per modificare o cancellare record
Link copiato negli appunti

In questa lezione vediamo come il controllo GridView possa essere utilizzato in modo molto semplice per modificare o cancellare record memorizzati in un database.

Per queste operazioni, GridView si rivela più semplice da utilizzare del vecchio DataGrid, in quanto il tutto può essere realizzato in modo visuale senza interventi sul codice.

Osserveremo però che, se non vogliamo allontanarci da questa semplicità di utilizzo, per effettuare l'inserimento di un record in una tabella di database occorre utilizzare un altro controllo, il DetailsView. Realizziamo un esempio partendo dal progetto che abbiamo realizzato nella precedente lezione.

Prendiamo la Default_s.aspx, e visualizzando il sorgente controlliamo qual'è il DataSource associato alla GridView.

Listato 31. Dichiarazione della GridView

<asp:GridView
  ID="GridView1"
  runat="server"
  AutoGenerateColumns="False"
  DataKeyNames="au_id"
  DataSourceID="SqlDataSource1"
  GridLines="None"
  AllowSorting="True">

L'origine dati risulta essere SqlDataSource1. Configuriamo ora il controllo SqlDataSource1 in modo che supporti l'edit e la cancellazione di record. In modalità visuale andiamo tra le Attività di SqlDataSource e configuriamo l'origine dati.

Arriviamo alla finestra per la costruzione delle query e spuntiamo prima l'opzione Specificare le colonne di una tabella o vista, e poi l'asterisco per impostare una Select su tutti i campi ed il WHERE... per selezionare lo stato come fatto in precedenza. Quindi clicchiamo "Avanzate...". Appare una nuova finestra.

Figura 1. Opzioni per costruire comandi Update e Delete
Opzioni per costruire comandi Update e Delete

Qui spuntiamo le due opzioni. La prima serve per generare le istruzioni SQL per fare aggiornamento, cancellazione e inserimento, e la seconda per evitare conflitti nell'aggiornamento dei record.

Clicchiamo su "Ok" poi "Avanti" e "Fine". Se ci viene chiesto di apportare modifiche alla GridView rifiutiamo.

Tra le Attività di GridView appaiono due nuove caselle che ci permettono di abilitare la griglia alla modifica e alla cancellazione. Le spuntiamo entrambe e siamo pronti per testare la nostra applicazione

Figura 2. Attività di GridView con modifica e cancellazione
DESCRIZIONE

Siamo pronti per testare la nostra applicazione, salviamo e proviamo:

Figura 3. Risultato finale
Risultato finale

Spendiamo due parole sull'opzione "Usa concorrenza ottimistica". Selezionando questa opzione, l'SqlDataSource controlla se è avvenuto un cambiamento nella tabella da quando essa è stata editata per il nostro aggiornamento. Ciò per evitare che un utente aggiorni la tabella coprendo le modifiche fatte da un altro potenziale utente che nel frattempo l'ha aggiornata. Se si verifica che il record originale è stato modificato durante il nostro edit, il successivo aggiornamento non avrà luogo.

Proviamo a visualizzare il codice generato andando in modalità "Origine".

Listato 32. Definizione dell'origine dati con modifica e cancellazione

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:PUBSConnectionString %>"
SelectCommand="SELECT * FROM [authors] WHERE ([state] = @state)"

ConflictDetection="CompareAllValues"

DeleteCommand="DELETE FROM [authors] WHERE [au_id] = @original_au_id AND [au_lname] = @original_au_lname AND [au_fname] = @original_au_fname AND [phone] = @original_phone AND [address] = @original_address AND [city] = @original_city AND [state] = @original_state AND [zip] = @original_zip AND [contract] = @original_contract" InsertCommand="INSERT INTO [authors] ([au_id], [au_lname], [au_fname], [phone], [address], [city], [state], [zip], [contract]) VALUES (@au_id, @au_lname, @au_fname, @phone, @address, @city, @state, @zip, @contract)"

UpdateCommand="UPDATE [authors] SET [au_lname] = @au_lname, [au_fname] = @au_fname, [phone] = @phone, [address] = @address, [city] = @city, [state] = @state, [zip] = @zip, [contract] = @contract WHERE [au_id] = @original_au_id AND [au_lname] = @original_au_lname AND [au_fname] = @original_au_fname AND [phone] = @original_phone AND [address] = @original_address AND [city] = @original_city AND [state] = @original_state AND [zip] = @original_zip AND [contract] = @original_contract"
>

<SelectParameters>
<asp:ControlParameter ControlID="DropDownList1" Name="state" PropertyName="SelectedValue"
Type="String" />
</SelectParameters>

<DeleteParameters>
<asp:Parameter Name="original_au_id" Type="String" />
<asp:Parameter Name="original_au_lname" Type="String" />
<asp:Parameter Name="original_au_fname" Type="String" />
<asp:Parameter Name="original_phone" Type="String" />
<asp:Parameter Name="original_address" Type="String" />
<asp:Parameter Name="original_city" Type="String" />
<asp:Parameter Name="original_state" Type="String" />
<asp:Parameter Name="original_zip" Type="String" />
<asp:Parameter Name="original_contract" Type="Boolean" />
</DeleteParameters>

<UpdateParameters>
<asp:Parameter Name="au_lname" Type="String" />
...
<asp:Parameter Name="original_au_id" Type="String" />
...
</UpdateParameters>

<InsertParameters>
<asp:Parameter Name="au_id" Type="String" />
...
</InsertParameters>
</asp:SqlDataSource>

Notiamo la presenza degli attributi DeleteCommand, InserCommand ed UpdateCommand, con i relativi parametri. L'UpdateCommand ad esempio controlla se ci sono stati aggiornamenti al record originale e l'aggiornamento avviene solo se ciò non è avvenuto. Per tenere traccia dei record originali, li immagazzina con nome preceduto dalla stringa "original_".

Notiamo inoltre la presenza dell'attributo ConflictDetection che serve ad implementare la strategia "First-One Wins" (il primo che arriva vince) per la risoluzione di eventuali conflitti nell'accesso ai dati.

Un'altra cosa che si può fare è catturare l'errore che si verifica se la procedura di aggiornamento non ha successo. Infatti, ad ogni aggiornamento possiamo gestire un evento GridView1_RowUpdated implementando il delegato nel seguente modo:

Listato 33. Verificare l'aggiornamento sull'evento RowUpdated

protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
 if (e.Exception != null)
 {
  Response.Write("Il record non è stato aggiornato!");
  e.ExceptionHandled = true;
 }
 else
  Response.Write("Record aggiornato con successo!");
}

Naturalmente, affinché l'evento venga gestito, all'interno del GridView1 dobbiamo inserire OnRowUpdated="GridView1_RowUpdated"

Testiamo e verifichiamo:

Figura 4. Risultato con verifica dell'aggiornamento
Risultato con verifica dell'aggiornamento

L'esempio realizzato nel corso di questa lezione può essere scaricato da qui.

Ti consigliamo anche