2010-07-06 4 views
3

Compte tenu de ce qui suitUne DropDownList dans un CompositeControl doit-elle retenir l'élément sélectionné?

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 persistait. (Le premier élément de la liste est toujours sélectionné à la place)

Le dernier élément sélectionné doit-il être conservé automatiquement dans ViewState ou est-ce que j'attends trop?

Répondre

2

Je pense que c'est un problème ViewState caché. Vous créez et liez un contrôle dans CreateChildControls. Vous devriez seulement créer le contrôle à cet endroit. Déplacez le code de liaison à l'événement de chargement de classes et utilisez EnsureChildControls.

+0

Correct. Merci pour le pointeur. – tomfanning

-1

Voici la solution la mieux recommandée. Il réside dans la compréhension du cycle de vie de la page correctement !! Les commandes de publication, telles que la liste déroulante, restaurent leur état affiché (l'élément sélectionné d'une liste déroulante est affiché). Il oublie sa valeur sélectionnée parce que vous le reliez dans l'événement Page_Load, qui est après que la liste déroulante a été chargée avec la valeur affichée (parce que View State est chargé après l'événement Page_Init et avant l'événement Page_Load). Et dans cette reliure dans l'événement Page_Load, la liste déroulante oublie son élément sélectionné restauré. La meilleure solution consiste à effectuer la liaison de données dans l'événement Page_Init au lieu de l'événement Page_Load.

faire quelque chose comme ci-dessous ...

Suppose Nom de la 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(); 
} 

charges ASP.NET Voir Etat de contrôle après l'événement Page_Init et avant l'événement Page_Load, afin selectedIndex de liste déroulante ne sera pas affecté, et vous obtiendrez les résultats souhaités par magie !!

+1

-1. Nous parlons de CompositeControl ici, pas de pages ASP.NET. Voir http://msdn.microsoft.com/fr-fr/library/system.web.ui.webcontrols.compositecontrol(v=VS.90).aspx – tomfanning

Questions connexes