È 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
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
- Intercettare gli eventi di creazione degli oggetti con #entityframework 7 https://aspit.co/cff di @sm15455
- Inviare manualmente il contenuto di una form AJAX di ASP.NET MVC tramite jQuery
- Rilasciato VirtualPC 2007
- Social login con ASP.NET Web Forms 4.5 e ASP.NET MVC 4
- Effettuare un redirect permanente di una pagina ASP.NET 4.0
- Attesa e validazione manuale nelle pipeline YAML di Azure DevOps