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?

È stato utile?

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 !!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top