2010-02-17 13 views
4

Je génère une liste déroulante dans codebehind et je ne parviens pas à déclencher automatiquement l'événement selectedindexchanged. Cela fonctionne très bien lorsqu'il est placé directement dans la page ASPX, mais j'en ai besoin dans le codebehind.Liste déroulante ASP.NET dans Codebehind vs dans ASPX page

Cela ne fonctionne pas:

var deptList = new DropDownList 
    { 
     ID = "deptList", 
     DataSource = departments, 
     DataTextField = "deptname", 
     DataValueField = "deptid", 
     AutoPostBack = true, 
     EnableViewState = true 
    }; 

deptList.SelectedIndexChanged += new EventHandler(deptList_SelectedIndexChanged); 
deptList.DataSource = departments; 
deptList.DataTextField = "deptname"; 
deptList.DataValueField = "deptid"; 

if (!IsPostBack) 
    deptList.DataBind(); 

deptList.Items.Insert(0, new ListItem("---Select Department---", string.Empty)); 

writer.Write("Select a department: "); 
deptList.RenderControl(writer); 

mais cela fonctionne:

<asp:DropDownList ID="deptList" AutoPostBack="true" runat="server" OnSelectedIndexChanged="deptList_SelectedIndexChanged"></asp:DropDownList> 

Répondre

6

Le problème peut être si vous n'êtes pas ajouter le contrôle à la page assez tôt. Les contrôles doivent être ajoutés au début du cycle de vie de la page pour que leurs événements soient liés.

Vous le faites probablement dans l'événement Load, qui est trop tard. Essayez de l'ajouter lors de l'événement Init ou de surcharger la méthode CreateChildControls. Editer: Comme l'a mentionné Dave Swersky, assurez-vous de le faire sur CHAQUE demande de page, y compris les publications.

+0

Donc comme je le rends à un HTMLTexWriter, est-ce que je le rendrai à celui de Init ou Load? – Alex

+0

Je mets tout le bloc de code dans le page_init et rien ne se passe encore – Alex

+0

Comparez le balisage entre l'implémentation de travail (balisage) et le non-fonctionnement (code) dans Firebug ou la console de développement IE. Quelque chose est différent. –

2

Vous avez un maillage dans votre code. Essayez de diviser la création, la liaison de données et l'appel d'événements.

Exemple:

<asp:DropDownList ID="deptList" AutoPostBack="true" runat="server"></asp:DropDownList> 

Puis dans le code derrière (Page_Load):

deptList.SelectedIndexChanged += new EventHandler(deptList_SelectedIndexChanged); 

if (!IsPostBack) 
{ 
    deptList.DataTextField = "deptname"; 
    deptList.DataValueField = "deptid"; 
    deptList.DataSource = departments; 
    deptList.DataBind(); 
    deptList.Items.Insert(0, new ListItem("---Select Department---", string.Empty)); 
} 
2

Pour des précisions sur la réponse de Mike Mooney: vous devez également vous assurer que vous ajoutez le contrôle de nouveau dans l'arbre de commande à chaque publication. L'arborescence de contrôle est recréée à chaque publication, lue à partir du balisage. Si vous l'ajoutez une fois par programme et plus jamais, il n'y a aucun contrôle dans l'arbre pour recevoir l'événement.

+0

Merci Dave. Oui, j'ai négligé de mentionner cette partie très importante, les contrôles doivent TOUJOURS être créés, qu'il s'agisse d'une publication ou non. Cela m'a attrapé plusieurs fois auparavant. –

0

Il semble que vous n'ayez pas ajouté le contrôle à la collection de contrôles. Vous devez ajouter le contrôle quelque part dans la hiérarchie de contrôle et vous assurer qu'il est ajouté à chaque publication pour s'assurer que le contrôle existe pour recevoir l'événement. En ajoutant le contrôle, vous ne devriez pas avoir besoin d'appeler directement RenderControl.

0

Le problème que j'avais était que si la liste déroulante n'avait pas AutoPostBack = true alors il n'appellerait jamais la fonction.