#864 - Un CommandField personalizzato per GridView con alert di conferma

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:

<%@ Register Namespace="MyWebControl" TagPrefix="MyWebControl" %>
<asp:GridView runat="server">
  <Columns>
    ...
    <MyWebControl:ClientRuleCommandField ShowDeleteButton="True" ShowEditButton="True" ShowSelectButton="True" ButtonType="Image"  />
  </Columns>
</asp:GridView>

Nota: Questo script contiene un allegato.


Approfondimenti

Commenti

Esprimi il tuo giudizio su questo script:

Per procedere devi essere autenticato.

robertof scrive:
#864 - Un CommandField personalizzato per GridView con alert di conferma

Ho provato tramite un ciclo ad impostare l'evento onClientClick di un bottone di una gridview, in questo modo:int i = 0;foreach (GridViewRow riga in ...
venerdì 2 maggio 2008 | 3 risposte
VicVonDoom scrive:
#864 - Un CommandField personalizzato per GridView con alert di conferma

Molto interessante questo esempio, solo non riesco a capire perchè, sul delete, chiede conferma ma non scatena l'evento GridView1_RowCommand (sull'...
venerdì 27 aprile 2007 | 4 risposte

Per inserire un commento, devi registrarti alla nostra community.




IN EVIDENZA
MISC