2010-11-01 18 views
1

J'utilise un panneau de mise à jour. Dans ce panneau de mise à jour, il y a un contrôle de listbox. J'ai en fait mis la propriété autopostback à false dans le code derrière. Mais il continue d'exécuter l'événement SelectedIndexChanged si l'index sélectionné est modifié.Le déclenchement de l'événement SelectedIndexChanged, mais la propriété autopostback de la liste est false - ASP.NET

Pourquoi cela se produit-il?

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 
             <ContentTemplate> 

              <asp:MultiView ID="mvForms" runat="server" ActiveViewIndex="1"> 
               <asp:View ID="View1" runat="server"> 
                <asp:Panel ID="Panel5" runat="server" GroupingText="Available Evaluation Forms" meta:resourcekey="rsKey_panel5" 
                Width="100%"> 
                 <asp:ListBox ID="lbAvailableForms" runat="server" AutoPostBack="true" 
                  style="height: 125px; width: 95%;" 
                  onselectedindexchanged="lbAvailableForms_SelectedIndexChanged"></asp:ListBox> 
                 </asp:Panel> 
               </asp:View> 
               <asp:View ID="View2" runat="server"> 
                <asp:Panel ID="Panel11" runat="server" GroupingText="Available Evaluation Forms" meta:resourcekey="rsKey_panel11"  Width="100%"> 
                 <div style="height: 125px; width: 95%; text-align:center;"> 
                  <br /> 
                  <br /> 
                  <asp:Label ID="lblAllSelected" runat="server" Text="All Selected" meta:resourcekey="rsKey_lblAllSelected"></asp:Label></div> 
                </asp:Panel> 
               </asp:View> 
              </asp:MultiView> 
           </ContentTemplate> 
          <Triggers>  
          <asp:AsyncPostBackTrigger ControlID="RLCompareParameter" EventName="SelectedIndexChanged"></asp:AsyncPostBackTrigger>   
          <asp:AsyncPostBackTrigger ControlID="cbAllForms" EventName="CheckedChanged"></asp:AsyncPostBackTrigger> 
         </Triggers> 
         </asp:UpdatePanel>    

Le nom de la zone de liste est lbAvailableForms. Pendant le débogage, j'ai vérifié la propriété autopostback de ce contrôle de zone de liste, puis j'ai trouvé que la propriété est fausse. Son aspect est si étrange que le déclenchement de l'événement selectedindexchange

Ici cbAllForm est un contrôle de case à cocher et RLCompareParameter est une liste radilo. Parfois, j'ai besoin d'obtenir la propriété de publication automatique est vrai. Donc au départ, j'ai défini cette propriété sur true. sous l'événement RLCompareParameter_SelectedIndexChanged, je mets lbAvailableForms.Autopostback = false. Mais après avoir défini la propriété sur false, la liste déroulante déclenche l'événement indexchanged sélectionné

+0

Veuillez poster les sections correspondantes de votre code. Notez que SelectedIndexChanged se déclenchera également après un retour normal. – cbp

+0

Merci pour votre réponse. J'ai ajouté du code. –

+0

Qu'est-ce que 'cbAllForms'? Le problème persiste-t-il si vous définissez la propriété [ChildrenAsTriggers] (http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.childrenastriggers.aspx) de 'UpdatePanel1' sur' false'? –

Répondre

2

Il est peut-être trop tard pour modifier la propriété AutoPostBack dans la phase de gestion des événements: le UpdatePanel a peut-être déjà enregistré ses déclencheurs.

Je commencerais par la désactivation AutoPostBack et ViewState (qui se souvient AutoPostBack) sur la liste:

<asp:ListBox ID="lbAvailableForms" runat="server" 
    AutoPostBack="False" EnableViewState="False" 
    Style="height: 125px; width: 95%;" 
    OnSelectedIndexChanged="lbAvailableForms_SelectedIndexChanged"> 
</asp:ListBox> 

Enfilez ensuite un membre pour garder une trace de ce que nous voulons faire et mettre le membre en cas gestionnaire:

private bool _disableAutoPostBack = false; 

protected void RLCompareParameter_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    _disableAutoPostBack = true; 
} 

utiliser ensuite dans la phase PreRender après:

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    lbAvailableForms.AutoPostBack = !_disableAutoPostBack; 
} 

Ensuite, espérons que cela fonctionne comme il est, donc nous ne devons pas enregistrer dynamiquement un AsyncPostBackTrigger sur le ListBox, ce qui serait désordonné.