Se un DropDownList all'interno di un CompositeControl ricordo selezionato articolo?
-
02-10-2019 - |
Domanda
Dato il seguente
public class MyControl : CompositeControl
{
private DropDownList myList;
protected override void CreateChildControls()
{
base.CreateChildControls();
myList = new DropDownList();
myList.AutoPostBack = true;
this.Controls.Add(myList);
if (!Page.IsPostBack)
{
myList.DataSource = MyBLL.SomeCollectionOfItems;
myList.DataBind();
}
}
}
Trovo che gli elementi dell'elenco persistono correttamente, ma quando un controllo diverso è reso e allora questo è reso ancora una volta, l'ultima voce selezionata non viene mantenuto. (La prima voce della lista è sempre selezionata invece)
Qualora l'ultimo elemento selezionato essere mantenuta nel ViewState automaticamente, o sto aspettavo troppo?
Soluzione
Credo che questo è un problema nascosto ViewState. È possibile creare e si legano un controllo in CreateChildControls. È necessario creare solo il controllo in questo luogo. Spostare il codice vincolante per le EnsureChildControls eventi e sull'uso di classi di carico.
Altri suggerimenti
Ecco la soluzione che è meglio consigliato. Si trova nel understandng Page ciclo di vita correttamente !! Controlli postback come elenco a discesa ristabilire il loro stato distaccati (l'elemento selezionato di una lista di Down goccia spedita). Si dimentica il suo valore selezionato perché si sta rilegatura in Page_Load, che è dopo la discesa è stata caricata con valore di iscrizione (a causa dello stato di visualizzazione viene caricato dopo evento Page_Init e prima dell'evento Page Load). E in questo rilegatura in Page_Load, l'elenco verso il basso goccia dimentica la sua voce selezionata restaurato. La soluzione migliore è quella di eseguire l'associazione dati in caso Page_Init invece di Page_Load.
Do qualcosa di simile al di sotto ...
Supponiamo nome discesa è lstStates.
protected void Page_Init(object sender, EventArgs e)
{
lstStates.DataSource = QueryDatabase(); //Just an example.
lstStates.DataTextField = "StateName";
lstStates.DataValueField = "StateCode";
lstStates.DataBind();
}
ASP.NET il controllo di stato di visualizzazione After Page_Init e prima dell'evento Page Load, i carichi in modo di discesa selectedIndex non saranno interessati, e si ottengono i risultati desiderati magicamente !!