2010-04-07 4 views
1

Je construis un contrôle aspom cutom à l'intérieur duquel j'ai deux listes déroulantes: companyIdSelection et productFamilySelection.I peuplent la companyIdSelection à Page_Load et afin de peupler la productFamilySelection en fonction de l'élément sélectionné dans companyIdSelection. J'utilise UpdatePanels pour y parvenir, mais pour une raison quelconque, chaque fois que je mets à jour companyIdSelection Page_Load est appelé (ce qui ne devrait se produire que lorsque la page entière est rechargée), la liste est à nouveau rechargée et l'élément utilisateur sélectionné est perdu (l'élément sélectionné est toujours du haut) le code de .IciUpdatePanel recharge toute la page

<asp:UpdatePanel ID="updateFamilies" 
        runat="server" 
        UpdateMode="Always">   
     <ContentTemplate> 
      Company ID:<br> 
      <br></br> 
      <asp:DropDownList ID="companyIdSelection" 
           runat="server" 
           AutoPostBack="True" 
           OnSelectedIndexChanged="companyIdSelection_SelectedIndexChanged"> 
      </asp:DropDownList> 
      <br></br> 
      Product Family: 
      <br></br> 
      <asp:DropDownList ID="productFamilySelection" runat="server" 
           AutoPostBack="True" 
           onselectedindexchanged="productFamilySelection_SelectedIndexChanged"> 
      </asp:DropDownList> 
      <br> 
     </ContentTemplate>     
    </asp:UpdatePanel> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    this.companyIdSelection.DataSource = companyIds(); //companyIds returns the object containing the initial data items 
    this.companyIdSelection.DataBind(); 
} 

protected void companyIdSelection_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // Page_Load is called again for some reason before this method is called, so it 
    // resets the companyIdSelection 
    EngDbService s = new EngDbService(); 
    productFamilySelection.DataSource = s.getProductFamilies(companyIdSelection.Text); 
    productFamilySelection.DataBind(); 
} 

En outre, j'ai essayé de définir le UpdateMode du UpdatePanel sur "Conditionnel" et d'ajouter un déclencheur asyncpostback mais le résultat était le même. Qu'est-ce que je fais de mal?

PS: Je résolu le problème de mise à jour, en utilisant Page.IsPostBack dans la méthode Page_Load, mais je ne voudrais encore éviter une publication complète si possible

Répondre

12

Je pense que vous comprenez mal comment fonctionnent les UpdatePanels. Ils font effectivement une publication en pleine page, c'est juste que pendant la phase de rendu ils capturent seulement une partie de la sortie et la renvoient dans la réponse AJAX afin que la page puisse être mise à jour. Par conséquent, vous devrez toujours vérifier s'il s'agit d'une publication dans votre événement page_load et effectuer uniquement votre chargement de données s'il n'en est pas un.

+0

Très bien, vous avez raison, j'ai mal compris. Merci :) –

2

Le rappel du panneau de mise à jour effectuera le chargement de la page à chaque rappel. En face, le cycle de vie de la page pull (moins render et prerender) se produira. Les panneaux de mise à jour donnent l'apparence d'ajax, mais votre code côté client affiche toujours la même page - c'est le problème que vous décrivez. Si vous pouvez éviter d'utiliser Update Panels, je vous suggère de le faire. Utilisez quelque chose comme jQuery à la place. Si ce n'est pas le cas, utilisez-le dans votre Page_Load

if (Page.IsCallback) { } //Do callback specific code here 
else { } //Do Postback specific code here 

Espérons que cela vous aide. Bonne chance.

Questions connexes