L'utilizzo dei databound control facilita enormemente lo sviluppo di interfacce utente, evitando allo sviluppatore il compito noioso e ripetitivo di collegarle ai dati.
A questo scopo GridView e DetailsView forniscono diversi contenitori, tra cui CommandField che ha il compito di mostrare dei pulsati per l'eliminazione, la modifica e l'inserimento dei dati.
L'unico limite di questo controllo è la mancanza di un meccanismo per mostrare un messaggio di conferma per le operazioni di eliminazione e update, limite che può essere facilmente superato creando un CommandField custom.
E' sufficiente creare una nuova classe che erediti da CommandField, eseguendo l'override del metodo InizializeCell e richiamando l'implementazione base del metodo, assicurandosi che i controlli siano istanziati e aggiunti alle proprie celle.
public class ClientRuleCommandField : CommandField { public ClientRuleCommandField() { } public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex) { base.InitializeCell(cell, cellType, rowState, rowIndex); } }
Ignoriamo Footer ed Header ed in base allo stato della riga richiamiamo il nuovo metodo AddClientBehavior, passando il riferimento al controllo e allo script:
if (cellType == DataControlCellType.DataCell) { if (rowState == DataControlRowState.Edit) { AddClientBehavior(cell.Controls[0], OnUpdateClientClick); } else if (!ShowEditButton) { AddCl ientBehavior(cell.Controls[0], OnDeleteClientClick); } else { AddClientBehavior(cell.Controls[2], OnDeleteClientClick); } }
Da notare che, a differenza di quanto accade nelle celle create con la riga in stato di modifica, l'indice del controllo passato al metodo AddClientBehavior varia in base alla visibilità del tasto di modifica.
Il metodo AddClientBehavior, basandosi sulla proprietà ButtonType ereditata da CommandField, esegue un cast del riferimento generico dalla classe Control al WebControl appropriato, assegna un ID ed imposta la proprietà OnClientClick:
private void AddClientBehavior(Control control, string _clientBehavior) { switch (ButtonType) { case ButtonType.Button: Button _button = (Button)control; _button.ID = "MyCommandField"; if (_button.UseSubmitBehavior) _button.UseSubmitBehavior = false; _button.OnClientClick = _clientBehavior; break; case ButtonType.Link: LinkButton _linkButton = (LinkButton)control; _linkButton.ID = "MyCommandField"; _linkButton.OnClientClick = _clientBehavior; break; case ButtonType.Image: ImageButton _imageButton = (ImageButton)control; _imageButton.ID = "MyCommandField"; _imageButton.OnClientClick = _clientBehavior; break; } } Lo script client-side può essere impostato dall'utente mediante le proprieta OnUpdateClientClick e OnDeleteClientClick, rispettivamente associate al tasto di aggiornamento o cancellazione. Nel caso lo sviluppatore decida di non aggiungere nessuno script ne viene assegnato uno di default. Allo script è allegato il codice d'esempio con commenti ed ulteriori approfondimenti. Per utilizzare la classe allegata allo script è sufficiente copiare il file .cs nella cartella App_Code e registrare il namespace, utilizzando nel GridView come se fosse una normale colonna: [code lang="aspx"]<%@ Register Namespace="MyWebControl" TagPrefix="MyWebControl" %> <asp:GridView runat="server"> <Columns> ... <MyWebControl:ClientRuleCommandField ShowDeleteButton="True" ShowEditButton="True" ShowSelectButton="True" ButtonType="Image" /> </Columns> </asp:GridView>
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.