Question

Dans le cas suivant

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();
        }
    }
}

Je trouve que les éléments de la liste persistent correctement, mais quand un contrôle différent est rendu, puis celui-ci est rendu à nouveau, le dernier élément sélectionné ne persistent pas. (Le premier élément de la liste est toujours sélectionnée à la place)

Si le dernier élément sélectionné persistés dans ViewState automatiquement, ou suis-je trop attendre?

Était-ce utile?

La solution

Je pense que cela est une question ViewState cachée. Vous créez et se lient un contrôle CreateChildControls. Vous ne devez créer le contrôle à cet endroit. Déplacez le code de liaison à l'événement charge classes et utilisation EnsureChildControls.

Autres conseils

Voici la solution qui est le mieux recommandé. Il se trouve dans understandng la page du cycle de vie correctement !! Contrôles Postback comme liste déroulante de restaurer leur état détachés (l'élément sélectionné d'une liste déroulante affichée). Elle oublie sa valeur sélectionnée parce que vous reconsolidation en cas Page_Load, qui est après la liste déroulante a été chargée avec la valeur affichée (parce que l'état d'affichage est chargé après l'événement Page_Init et avant l'événement Page_Load). Et dans cette reconsolidation dans l'événement Page_Load, la liste déroulante oublie son élément sélectionné restauré. La meilleure solution est d'effectuer la liaison de données en cas Page_Init au lieu de l'événement Page_Load.

Faites quelque chose comme ci-dessous ...

Supposons nom liste déroulante est 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 Voir Etat de contrôle des charges après l'événement Page_Init et avant l'événement Page_Load, donc ne sera pas affecté selectedIndex de liste déroulante, et vous obtiendrez les résultats souhaités par magie !!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top