È 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
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Accedere a risorse e immagini in Windows Store app di Windows 8
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Permettere il Drag-and-drop solo su zone predefinite con Silverlight 2.0
- Consumare dati binari in realtime lato client con ASP.NET Core SignalR
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Personalizare l'icona e le funzionalità di un sito web per iOS e IE
- Caricamenti veloci da CDN e fallback locale con ASP.NET Core
- Utilizzare dati in formato XML in XAML
- Accedere a dati esposti con WebService con Silverlight 1.0


