2010-02-15 11 views
1

J'ai un complexe UserControl avec le but principal d'encapsuler DropDownList avec un certain nombre de propriétés pour une manipulation avancée.Sélection de l'élément dans DropDownList encapsulé sur DataBind

Liste est peuplée sur PreRender événement en fonction des propriétés précédemment ont été définies:

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    sourceClient.SelectCommand = this.Property1 ? "exec a" : "exec b"; 
} 

La propriété la plus utilisée est ClientID:

[Category("Settings")] 
public int ClientID 
{ 
    get 
    { 
     return Int32.Parse(DropDownList1.SelectedItem.Value); 
    } 
    set 
    { 
     DropDownList1.Items.FindByValue(value).Selected = true; 
    } 
} 

Getter est communément appelé par ControlPameters dans SqlDataSources pages avec ce contrôle.

Setter - à partir du balisage: <uc:UserControl1 runat="server" ClientID='<%# Bind("ID") %>' />.

La question est la suivante:

Pourquoi poseur de Bind est appelé plus tôt alors PreRender? Et DropDownList est vide et la sélection d'élément ne fonctionne pas! Comment contourner ce problème?

Édition1: Ok, pas PreRender mais Init. Mais DropDownList1_DataBinding est toujours appelé après le setter de propriété! DataBinding se produit toujours avant PreRender

Répondre

1

De ASP.Net Page Lifecycle:

DataBinding
Cet événement est déclenché par contrôles liés aux données avant l'événement PreRender du contenant contrôle (ou de l'objet Page) et marque le début de lier le contrôle à les données.

Utilisez cet événement pour ouvrir manuellement les connexions de base de données , si nécessaire. (Les commandes de source de données font souvent cela inutile.)

Une solution à votre problème serait juste gérer l'événement DataBinding et pré-lier votre dropdownlist (ou même le faire pendant Load), plutôt que attendre tout le chemin jusqu'à PreRender. Cela garantirait que le DropDownList était disponible lorsque l'appel Bind se déclenche.

Une autre solution consisterait simplement à transmettre à votre contrôle une référence à la source de données elle-même, plutôt que d'utiliser un appel Bind. Ensuite, il pourrait programmer par liaison lui-même au bon moment - vous pouvez charger votre DropDownList, puis obtenir votre ID pour cela, tout au cours de PreRender, en accédant à la source de données.

+0

@womp: Salut, merci pour les conseils! J'ai réécrit mon code maintenant j'ai le gestionnaire d'événement Page_DataBinding mais toujours d'abord s'appelle Page_DataBinding après le setter de propriété et après DropDownList1_DataBinding où il est peuplé à partir d'une source de données. Comment lier les données liste déroulante avant setter? – abatishchev