DropDownList che memorizza il valore selezionato prima del postback

di Marco Leoncini, in UserScript, ASP.NET, C#,

È capitato che nel forum venisse chiesto come è possibile recuperare il vecchio valore selezionato in una DropDownList.
Nell'evento SelectIndexChanched, come in molti altri controlli, il delegate utilizzato come prototipo per i metodi che lo gestiranno definisce due parametri, il primo è l'oggetto che ha scatenato l'evento, il secondo è utilizzato per trasmettere eventuali informazioni aggiuntive legate all'evento.
Nel caso della DropDownList tale oggetto è vuoto (EventArgs.Empty), quindi non è trasmessa nessuna informazione.
Il vecchio valore è memorizzato nel ViewState e viene utilizzato per generare l'evento (tramite un confronto con il nuovo valore) e con un po' di codice è possibile modificare la DropDownList al fine di trasmettere questa informazione:

using System;
using System.Web;
using System.Text;
using System.Web.UI;
using System.Web.Caching;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Collections.Specialized;

namespace DropDownListPlus
{ 
  [ToolboxData("<{0}:DropDownListPlus runat=server></{0}:DropDownListPlus>")]
  public class DropDownListPlus: System.Web.UI.WebControls.DropDownList,IPostBackDataHandler
  {
    private EventArgsPlus _eventArgs;
    private static readonly object EventSelectedIndexChangedPlus = new object();
    
    public class EventArgsPlus : EventArgs
    {
      private string OV;
      public EventArgsPlus(string oldValue)
      {
        OV = oldValue;
      }
      public string OldValue
      {
        get{ return OV;}
      }
    }
    
    public  DropDownListPlus(){}
    #region implementazione IPostBackDataHandler
    bool IPostBackDataHandler.LoadPostData(string postDataKey, NameValueCollection postCollection)
    {
      string[] textArray1 = postCollection.GetValues(postDataKey);
      if (textArray1 != null)
      {
        int num1 = FindByValue(textArray1[0]);
        if (this.SelectedIndex != num1)
        {
          _eventArgs = new EventArgsPlus(this.SelectedValue);
          this.SelectedIndex = num1;
          return true;
        
        }
      }
      return false;
    }
    void IPostBackDataHandler.RaisePostDataChangedEvent()
    {
      OnSelectedIndexChanged(_eventArgs);
    }
    #endregion
    private int FindByValue(string value)
    {
      int num1 = 0;
      foreach (ListItem item1 in this.Items)
      {
        if (item1.Value.Equals(value))
        {
          return num1;
        }
        num1++;
      }
      return -1;
    }
 
    #region gestione e generazione evento  
    public  delegate  void SelectedIndexChangedEventHandler(object sender, EventArgsPlus e);

    new public event SelectedIndexChangedEventHandler SelectedIndexChanged
    {
      add
      {
        Events.AddHandler(EventSelectedIndexChangedPlus,value);
      }
      remove
      {
        Events.RemoveHandler(EventSelectedIndexChangedPlus,value);
      }
    }

    protected virtual void OnSelectedIndexChanged(EventArgsPlus e)
    {
      SelectedIndexChangedEventHandler IndexChangedHandler = (SelectedIndexChangedEventHandler)Events[EventSelectedIndexChangedPlus];
      if(IndexChangedHandler != null)
      {
        IndexChangedHandler(this,e);

      }
    }
    #endregion
    
  }
}

Per poter trasmettere le informazioni aggiuntive legate all'evento abbiamo creato una nuova classe che eredita da EventArgs e la utilizziamo nel nuovo delegate, che servirà da prototipo per i metodi che dovranno gestire l'evento, nascondiamo SelectedIndexChangedEventHandler della classe base per definirne uno nuovo, infine l'overload del metodo OnSelectedIndexChanged è usato per scatenare l'evento.
EventArgsPlus viene valorizzata nel metodo LoadPostData (implementazione dell'interfaccia IPostBackDataHandler responsabile del caricamento dei dati inviati). In questa fase se il ViewState del controllo è attivato, la DropDownList è inizializzata con i valori precedenti.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi