2009-11-30 10 views
8

E 'possibile interrompere un ItemCommand o un evento di controllo dal ribollire della gerarchia di controllo? Dispongo di un controllo che contiene controlli utente figlio che possono o meno avere un codice che gestisce i loro eventi ItemCommand. Quello che vorrei fare è consentire al controllo figlio di decidere di non passare ItemCommand al controllo genitore nel caso in cui già elabori l'evento nel suo code-behind.Come si annulla il bubbling degli eventi in ASP.net?

Grazie,

Mike

risposta

11

Nella classe di controllo utente, sovrascrive OnBubbleEvent(). Se si restituisce true, si interromperà il "bubble up" ai controlli padre.

protected override bool OnBubbleEvent(object source, EventArgs args) 
    { 
     //handled 
     return true; 

     //uncomment line below to bubble up (unhandled) 
     //return base.OnBubbleEvent(source, args); 
    } 

Un'altra cosa in qualche modo pulito per pensare che ho trovato mentre armeggiare su questo, che potrebbe essere utile in alcuni casi ... è possibile modificare il nome del comando che 'sgorga' nel heirachy di controllo pure. Nel controllo utente figlio, usa OnCommand, anziché Onclick.

Quindi, supponiamo di avere un pulsante il controllo utente, modificare il codice da questa:

<asp:button id="mySpecialButton" 
      onClick="mySpecialButton_OnClick" runat="server"> 

a questo:

<asp:Button id="mySpecialButton" 
      CommandName="mySpecialCommand" 
      CommandArgument="myArgument" 
      OnCommand="mySpecialButton_Command" 
      runat="server"/> 

poi nel codebehind,

protected void mySpecialButton_Command(object sender, CommandEventArgs e) 
     { 
      RaiseBubbleEvent(this, new CommandEventArgs("Handled", e)); 
     } 

Quindi, nel comando ItemCommand del controllo genitore otterrete questo nuovo nome di comando anziché il nome del comando originale e dal controllo figlio, che puoi fare come ritieni opportuno.

0

Set e.Handled = true (se e è il nome della manifestazione).

+0

James, Non riesco a trovare la proprietà Handled citata. Attualmente sto cercando di farlo all'interno di un evento click del pulsante di un controllo utente. Il metodo ha la seguente firma: Sottotitolo protetto BtnAddToCart_Click (Sender ByVal As Object, ByVal e As System.EventArgs) Gestisce btnAddToCart.Click e in questo caso è solo EventArgs e non ha una proprietà gestita. C'è qualche altra cosa che dovrei provare ad accedere a questa proprietà? – mclark1129

1

L'evento Click tecnicamente non sta borbottando. Tale evento viene generato e gestito dal tuo codice ma il controllo elenco sta anche guardando l'evento Click e generando un evento ItemCommand. Non c'è modo di impedirlo perché non si può nemmeno garantire quale gestore di eventi verrà chiamato per primo.

Avete un comando associato al pulsante che non volete sollevare quell'evento? Probabilmente dovresti eliminare completamente il tuo evento Button_Click ed eseguire la gestione dei comandi nell'evento ItemCommand, controllando gli argomenti dell'evento per il CommandName e reagendo in modo appropriato.

In altre parole, utilizzare un CommandName che identifica ciò che si desidera che accada, quindi nell'evento ItemCommand, prendere provvedimenti solo quando viene visualizzato un CommandName di cui si è responsabili per la gestione.

+0

Non vi è alcuna menzione nella domanda di un evento Click, ma di un ItemCommand. Quale * fa * bolla. La risposta di Morgan mostra come gestirlo. – Ruben

+0

È stato menzionato in un seguito alla risposta di JamesL. Sì, la risposta di Morgan è migliore quindi perché è stata votata. StackOverflow funziona come progettato. – Josh

Problemi correlati