2012-06-30 18 views
5

Tengo dos UserControls - UserControl1.ascx y UserControl2.ascx en PageDefault.aspx:evento de propagación de los controles de usuario Web en ASP.NET

¿Cómo me puede llamar al método (GetLabelText() in UserControl1.ascx) de UserControl2.ascx utilizando la propagación de eventos?

Este es mi código de ejemplo: cuando hago clic en el botón (UserControl2Button1 in UserControl1.ascx) - Quiero llamar al método GetLabelText() from UserControl2.ascx - utilizando el evento de burbujeo.

PageDefault.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="PageDefault.aspx.cs" Inherits="TelerikAjaxEvents.PageDefault" %> 
<%@ Register TagPrefix="uc" TagName="UserControl1" Src="~/UserControl1.ascx" %> 
<%@ Register TagPrefix="uc" TagName="UserControl2" Src="~/UserControl2.ascx" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Page Default</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     UserControl1: 
     <uc:UserControl1 ID="UserControl1" runat="server" /> 

     UserControl2: 
     <uc:UserControl2 ID="UserControl2" runat="server" /> 

    </form> 
</body> 
</html> 

UserControl1.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UserControl1.ascx.cs" Inherits="TelerikAjaxEvents.UserControl1" %> 
<asp:Label ID="UserControl1Label1" runat="server"></asp:Label> 

UserControl1.ascx.cs

public partial class UserControl1 : System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     public void GetLabelText() 
     { 
      UserControl1Label1.Text = "Text is Visible"; 
     } 
    } 

UserControl2.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UserControl2.ascx.cs" Inherits="TelerikAjaxEvents.UserControl2" %> 
<asp:Button ID="UserControl2Button1" runat="server" Text="Send" 
    onclick="UserControl2Button1_Click" /> 

UserControl2.ascx.cs

public partial class UserControl2 : System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 

     protected void UserControl2Button1_Click(object sender, EventArgs e) 
     { 
      //Call method from UserControl1 (GetLabelText()) - Show Label text - USING BUBBLE EVENT 
     } 
    } 
+0

No hay un mecanismo de "burbujeo de eventos" en ASP.NET. Deberá exponer el evento agregando uno nuevo en UserControl2. – millimoose

Respuesta

5

Hay muchas maneras de hacerlo. La respuesta de Mark insinúa lo que se conocía clásicamente como el burbujeo de eventos usando una función incorporada en el control base System.Web.UI.Control. Sin embargo, es un ejercicio simple exponer su propio evento, vincularse a él y generar eventos a través de una jerarquía de control. Para obtener más detalles sobre el uso de BubbleEvent en ASP.NET, lea lo siguiente. Por favor, tenga en cuenta que estos dos artículos de MSDN fueron escritas para .NET 1,1

Bubbling an Event

Event Bubbling Control Sample

de K. Scott Allen hace un buen trabajo a demostrar exactamente lo que una implementación "la propagación de eventos" se parece en su publicación: Event Bubbling From Web User Controls in ASP.NET (C#). Consulte la siguiente modificación de su ejemplo para obtener inspiración.

UserControl1 con getLabelText()

public partial class UserControl1 : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public void GetLabelText() 
    { 
     UserControl1Label1.Text = "Text is Visible"; 
    } 
} 

UserControl2 con expuesta controlador de eventos BubbleClick que llaman pueden suscribirse.

public partial class UserControl2 : System.Web.UI.UserControl 
{ 
    protected Button UserControl2Button1; 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public event EventHandler BubbleClick; 

    protected void OnBubbleClick(EventArgs e) 
    { 
     if(BubbleClick != null) 
     { 
      BubbleClick(this, e); 
     } 
    }  
    protected void UserControl2Button1_Click(object sender, EventArgs e) 
    { 
     // do some stuff 
     OnBubbleClick(e); 
    } 
} 

PageDefault suscribe controlador de eventos BubbleClick de UserControl2 y ejecuta UserControl1.GetLabelText()

public partial class PageDefault : WebPage 
{ 
    UserControl1 userControl1; 
    UserControl2 userControl2; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     UserControl2.BubbleClick += RootBubbleClickHandler; 
    } 

    protected void RootBubbleClickHandler(object sender, EventArgs e) 
    { 
     if (sender is UserControl2) 
     { 
      // subscribe UserControl1 to UserControl2 click event and do something 
      userControl1.GetLabelText(); 
     } 

     // check for other controls with "BubbleClicks"   
    } 
} 
+0

Quiero decir algo como esto: http://odetocode.com/code/94.aspx ¿Cómo usar este ejemplo? – JohnMalcom

+0

Ya veo. He actualizado la respuesta para usar el patrón discutido en este artículo. ¿Esto está más en línea con lo que estabas pensando? –

0

Se puede tratar de declarar la UserControl1 como propiedad pública (por ejemplo. "UserControl1") en PageDefault.aspx y luego en UserControl2, use Parent.Page.UserControl1.GetLabelText()?

3

evento de propagación es un concepto mal entendido en ASP.NET Web Forms. Existe (y es utilizado por la mayoría de los controles de datos), pero a menudo se confunde con el concepto más simple de "implementar un evento en un control de usuario" (como lo hace K Scott Allen).

El núcleo del evento burbujeante es que el evento viaja a través de la jerarquía de control hasta que se maneja o llega a la raíz. Esto permite cierta centralización del código del controlador. Se implementa utilizando el Control.Métodos RaiseBubbleEvent y Control.OnBubbleEvent. El caso de uso principal son los controles con muchos controles secundarios (piense en Repetidores, ListViews, etc.). En lugar de suscribirse a cada control individual, el Repeater los captura a todos en su OnBubbleEvent y levanta un solo ItemCommandEvent para ellos.

Si realmente quería utilizar la propagación de eventos (en comparación con el ejemplo de K. Scott), se vería algo como:

class Page { 
    override bool OnBubbleEvent(object sender, EventArgs e) { 
     var btn = sender as Button; 
     if (btn == null) return false; 

     // You may want to do further checking that the source is what you want 
     // You could use CommandEventArgs to do this 
     this.uc1.GetLabelText(); 
     return true; 
    } 
} 

La secuencia de eventos es la siguiente:

- Button Clicked 
- Button RaiseBubbleEvent 
- UserControl OnBubbleEvent returns false (default, since you didn't override) 
- Page OnBubbleEvent 
Cuestiones relacionadas