2009-11-30 15 views
8

¿Es posible detener un evento ItemCommand o control para que no burbujee la jerarquía de control? Tengo un control que contiene controles de usuarios secundarios que pueden tener o no código que maneja sus eventos ItemCommand. Lo que me gustaría hacer es permitir que el control secundario decida no pasar ItemCommand junto con el control principal en el caso de que ya procese el evento en su código subyacente.¿Cómo cancelo el evento burbujeo en ASP.net?

Gracias,

Mike

Respuesta

11

En su clase de control de usuario, anule OnBubbleEvent(). Si devuelve verdadero, detendrá el "aumento de burbuja" a los controles principales.

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

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

Otra cosa un poco aseado que pensar que encontré mientras retoques en esto, que podría ser útil en algunos casos ... puede cambiar el nombre del comando que 'se propaga hacia arriba' en el heirachy de control también. En el control de usuario de su hijo, use OnCommand, en lugar de Onclick.

Así, supongamos que tiene un botón en el control de usuario, cambie el código de esto:

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

a esto:

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

a continuación en el código subyacente,

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

Por lo tanto, en el controlador ItemCommand de tu control padre obtendrás este nuevo nombre de comando en lugar del comando nam original e desde el control infantil, con lo que puede hacer lo que considere oportuno.

0

Conjunto e.Handled = true (si e es el nombre de su evento).

+0

James, Parece que no puedo encontrar la propiedad de Handled que mencionas. Actualmente estoy tratando de hacer esto dentro de un evento de clic de botón de control de usuario. El método tiene la firma siguiente: secundario protegido btnAddToCart_Click (remitente de ByVal como objeto, ByVal e As System.EventArgs) Maneja btnAddToCart.Click electrónico en este caso es sólo EventArgs y que no tiene una propiedad manejado. ¿Hay algún otro lugar donde debería intentar acceder a esta propiedad? – mclark1129

1

El evento Click técnicamente no está burbujeando. Su código genera y maneja ese evento, pero el control de lista también observa el evento Click y genera un evento ItemCommand. No hay forma de prevenir eso porque ni siquiera puedes garantizar qué controlador de eventos se llamará primero.

¿Tiene un CommandName asociado con el botón que no desea que genere ese evento? Probablemente deberías deshacerte de tu evento Button_Click por completo y realizar el manejo de tus comandos en el evento ItemCommand, verificando los argumentos del evento para CommandName y reaccionando de manera apropiada.

En otras palabras, use un CommandName que identifique lo que desea que suceda, luego en el evento ItemCommand, solo tome medidas cuando vea un CommandName que usted es responsable de manejar.

+0

No hay mención en la pregunta de un evento Click, sino de un ItemCommand. Que * hace * burbuja. La respuesta de Morgan muestra cómo manejar esto. – Ruben

+0

Se mencionó en una continuación de la respuesta de JamesL. Sí, la respuesta de Morgan es mejor y, por lo tanto, la razón por la que se votó. StackOverflow está funcionando como está diseñado. – Josh

Cuestiones relacionadas