Procedura: consentire agli utenti l'eliminazione di elementi nei controlli server Web DataList
Aggiornamento: novembre 2007
Sono disponibili diversi modi per consentire agli utenti di eliminare gli elementi presenti in un controllo DataList. Un modo prevede l'inclusione di un pulsante Elimina in un elemento, quindi l'eliminazione immediata di questo elemento quando l'utente fa clic sul pulsante.
Un altro modo prevede l'inclusione di una casella di controllo nei singoli elementi. L'utente può selezionare tutti gli elementi da eliminare, quindi fare clic su un pulsante Elimina separato per rimuovere l'intero gruppo di elementi. Questo metodo viene utilizzato in programmi quali MSN Hotmail.
Per consentire agli utenti di eliminare singoli elementi
Aggiungere un controllo origine dati alla pagina.
Definire il metodo o il comando di eliminazione per il controllo origine dati.
Se ad esempio si utilizza un controllo SqlDataSource, impostare la proprietà DeleteCommand del controllo origine dati su un'istruzione SQL Delete contenente un segnaposto per l'ID, come nell'esempio seguente:
DELETE FROM Categories WHERE CategoryID = @CategoryID
Se si utilizza un controllo ObjectDataSource, impostare la proprietà DeleteMethod sul nome del metodo che esegue l'operazione di eliminazione.
Nel controllo origine dati creare una voce per la proprietà DeleteParameters in cui è incluso un singolo parametro per l'ID del record da eliminare.
Di seguito è riportato un esempio di elemento SqlDataSource:
<asp:SqlDataSource ID="SqlDataSource1" Runat="server" ConnectionString= "<%$ ConnectionStrings:NorthwindConnectionString %>" DeleteCommand="DELETE FROM [Categories] WHERE [CategoryID] = @CategoryID"> <DeleteParameters> <asp:Parameter Type="Int32" Name="CategoryID"> </asp:Parameter> </DeleteParameters> </asp:SqlDataSource>
Nota: Nell'esempio non vengono descritti gli altri comandi, ad esempio SelectCommand e UpdateCommand.
Un elemento ObjectDataSource potrebbe essere simile al seguente:
<asp:ObjectDataSource ID="ObjectDataSource1" Runat="server" DeleteMethod="DeleteCategory()"> <DeleteParameters> <asp:Parameter Name="example"></asp:Parameter> </DeleteParameters> </asp:ObjectDataSource>
Nel controllo DataList impostare la proprietà DataKeyField sulla chiave primaria della tabella da cui si desidera eliminare i record.
Nella proprietà ItemTemplate e, se in uso, nella proprietà AlternatingItemTemplate aggiungere un controllo server Web Button o LinkButton.
Impostare la proprietà CommandName relativa al pulsante su delete.
I tag dell'elemento del controllo DataList potrebbero essere simili ai seguenti:
<asp:DataList ID="DataList1" Runat="server" DataSourceID="SqlDataSource1" DataKeyField="CategoryID" OnDeleteCommand="DataList1_DeleteCommand"> <ItemTemplate> CategoryName: <asp:Label ID="CategoryNameLabel" Runat="server" Text='<%# Eval("CategoryName") %>'> </asp:Label> <br /> Description: <asp:Label ID="DescriptionLabel" Runat="server" Text='<%# Eval("Description") %>'> </asp:Label> <br /> <asp:Button ID="Delete" Runat="server" Text="Delete" CommandName="delete" /> </ItemTemplate> </asp:DataList>
Creare un gestore eventi per l'evento DeleteCommand del controllo DataList. Nel metodo:
Ottenere l'ID del record da eliminare dall'insieme DataKeys del controllo DataList. È possibile ottenere la chiave relativa al record corrente utilizzando il valore di indice restituito dalla proprietà ItemIndex dell'elemento corrente.
Impostare la proprietà DefaultValue del parametro creato nel passaggio 3.
Chiamare il metodo Delete del controllo origine dati.
Nel seguente codice di esempio queste attività vengono illustrate utilizzando un controllo SqlDataSource denominato SqlDataSource1 come origine dati:
Protected Sub DataList1_DeleteCommand(ByVal source As Object, ByVal e As DataListCommandEventArgs) Dim id As Integer = _ CInt(DataList1.DataKeys(e.Item.ItemIndex)) SqlDataSource1.DeleteParameters("CategoryID").DefaultValue _ = id SqlDataSource1.Delete() End Sub
protected void DataList1_DeleteCommand(object source, DataListCommandEventArgs e) { int id = (int)DataList1.DataKeys[e.Item.ItemIndex]; SqlDataSource1.DeleteParameters["CategoryID"].DefaultValue = id; SqlDataSource1.Delete(); }
Per consentire agli utenti di eliminare più elementi contemporaneamente
Aggiungere un controllo origine dati alla pagina, configurarne il metodo o il comando di eliminazione, quindi creare un parametro come descritto nella procedura precedente.
Nella proprietà ItemTemplate e, se in uso, nella proprietà AlternatingItemTemplate del controllo DataList aggiungere un controllo server Web CheckBox e impostarne la proprietà ID su un nome specifico, ad esempio "Delete". Accertarsi che la proprietà AutoPostBack del controllo CheckBox sia impostata su false.
Aggiungere un controllo server Web Button alla pagina. Impostare la proprietà Text su "Delete All" e la proprietà ID su DeleteAll. Il pulsante non verrà aggiunto a uno dei modelli DataList.
Creare un metodo per l'evento Click del pulsante Elimina tutto. Nel metodo:
Scorrere l'insieme Items del controllo DataList, estraendo un singolo elemento alla volta.
All'interno dell'elemento utilizzare il metodo FindControl per ottenere il controllo CheckBox del passaggio 1 e verificarne la proprietà Checked.
Se la casella è selezionata, eliminare l'elemento corrispondente dall'origine dati.
L'esempio riportato di seguito illustra un gestore eventi per il pulsante DeleteAll che elimina l'intero gruppo di elementi mediante la procedura sopra descritta.
[Visual Basic]
[C#]