2010-08-26 19 views
0

J'ai le DropDownList suivant dans mon code qui tire dans le mauvais ordre:SelectedIndexChanged pour DropDownList dans le tir ASP.NET dans le mauvais ordre

public class MyWebpart : WebPart 
{ 
    private DropDownList dropDown = new DropDownList(); 

    private string selectedValue; 

    public Webpart() 
    { 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     dropDown.AutoPostBack = true; 
     dropDown.SelectedIndexChanged += new EventHandler(DropDown_SelectedIndexChanged); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     this.EnsureChildControls(); 
    } 

    protected void DropDown_SelectedIndexChanged(Object sender, EventArgs e) 
    { 
     selectedValue - dropDown.SelectedValue; 
    } 

    protected void override void CreateChildControls() 
    { 
     base.CreateChildControls(); 
     // create some stuff here 
    } 

j'attendais quand le menu déroulant des changements de sélection, DropDown_SelectedIndexChanged sera appelé en premier, mais à la place il passera par tout le cycle de vie allant de OnInit, OnLoad, CreateChildControls, puis DropDown_SelectedIndexChanged.

Ai-je raté quelque chose? Comment puis-je obtenir l'appel DropDown_SelectedIndexChanged en premier?

+0

Qu'est-ce que votre question a à voir avec C#? –

+0

comme le dit Tahbaza, le comportement du cycle de vie ne peut pas être facilement modifié. Peut-être pouvez-vous élucider pourquoi ce cycle de vie est un problème? –

Répondre

4

Vous ne pouvez pas modifier le cycle de vie de la page. Ce que vous pouvez faire est soit vérifier si Page.IsPostBack et faire quelque chose de approprié seulement au premier chargement OU vous pouvez créer un webservice et appeler ce webservice de javascript pour exécuter vos actionsindexchanged selecteds dans js plutôt que de poster toute la page.

Bonne chance!

+0

donc c'est à cause du cycle de vie ... Je dois avoir confondu avec autre chose. Retour à la question: Je remarque que la valeur SelectedValue de DropDownList n'a pas été enregistrée après l'actualisation de la page. Y a-t-il quelque chose que je peux utiliser pour le sauvegarder, donc après les changements de sélection, je peux obtenir la valeur et faire quelque chose avec? Merci. – BeraCim

+0

'dropDown.SelectedValue' doit contenir la valeur actuelle affichée de la liste déroulante. Assurez-vous simplement de ne pas relier la liste déroulante, de l'effacer ou d'autre chose dans le chargement de la page ou un autre événement avant que votre code qui vérifie la valeur sélectionnée ait une chance de l'examiner. – Tahbaza

+0

J'ai réussi à récupérer la valeur de la liste déroulante dans la méthode OnLoad, mais pas les CreateChildControls. En outre, OnLoad semblait fonctionner après CreateChildControls dans mon scénario. – BeraCim

0

La propriété dropDown.AutoPostBack = true; déclenche une publication qui l'amène à parcourir les événements du cycle de vie de la page.

Votre meilleur pari est de mettre if(!IsPostBack) { } au moins dans la méthode OnLoad pour filtrer les événements que vous ne vouliez pas sur la publication.

Vous pouvez écrire une fonction Javascript et l'appliquer à l'événement 'onchange' de la liste déroulante. Mais vous devrez désactiver l'autopostback et cela se produira du côté client plutôt que sur le serveur.

0

Les valeurs reportées ne sont pas accessibles à partir de CreateChildControls(); vous devez attendre jusqu'à l'événement OnLoad pour l'état d'affichage privé affiché à l'état à charger dans les contrôles.

Dans l'appel d'événement OnIntEnsureChildControls(); les valeurs postérieures sont alors disponibles dans les contrôles de l'événement OnLoad - note: EnsureChildControls() invoque CreateChildControls().

1

Ceci est vous appeler la méthode

protected void override void CreateChildControls() 
{ 
    base.CreateChildControls(); 
    dropDown.SelectedIndexChanged += new EventHandler(DropDown_SelectedIndexChanged); 
}