Suscribirse a un solo evento de control de usuario en varias páginas, asp.net 4.0

Tengo un control de usuario con un control de botón del lado del servidor asp.net. Uso este control de usuario en varias páginas. Estoy generando un evento personalizado en el evento de clic de botón del control de usuario. Todas las páginas principales que usan este control de usuario deben recibir una notificación de este evento personalizado que genero desde el control de usuario. ¿Hay alguna manera fácil de recibir una notificación de este evento personalizado en las páginas principales que no sea suscribirme a este evento en todas las páginas principales?

Intenté suscribirme a este evento de control de usuario en una clase base abstracta que anula el OnLoad() evento de las páginas principales y hacer que todas las páginas principales hereden de esta clase base abstracta. El código de control de usuario detrás es:

public partial class CustomPaging : System.Web.UI.UserControl
    {
         public delegate void NavigationButtonHandler(int currentPage);

         public event NavigationButtonHandler NavigationButtonClicked;
         public int CurrentPage { get; set; }

         protected void btnPrev_ServerClick(object sender, EventArgs e)
        {
            if (NavigationButtonClicked != null)
            {


                    NavigationButtonClicked(CurrentPage);


            }
        }

  }

Y la clase base abstracta es:

public abstract  class CustomPagingBase 
    {

        protected override void OnLoad(EventArgs e)
        {

                 base.OnLoad(e);
                ((CustomPaging)this.FindControl("ucPaging")).NavigationButtonClicked += new CustomPaging.NavigationButtonHandler(CustomPagingBase_NavigationButtonClicked);
        }

        void CustomPagingBase_NavigationButtonClicked(int currentPage)
        {
            LoadData(currentPage);
        }

        protected abstract void LoadData(int currentPage);


    }

pero la pieza this.FindControl("ucPaging") devuelve nulo. Tenga en cuenta que tengo un control de usuario con una identificación de ucPaging que configuré declarativamente en el marcado de la página principal

preguntado el 24 de agosto de 12 a las 19:08

1 Respuestas

FindControl no busca recursivamente de forma predeterminada.

Así que a menos que tu ucPaging el control se agregó directamente a la colección de controles que implementa su clase abstracta, obtendría un valor nulo.

Puedes usar esta función para encontrarlo.

    public static Control FindControlRecursive(this Control control, string id)
    {
        if (control == null) return null;
        //try to find the control at the current level
        Control ctrl = control.FindControl(id);
        if (ctrl == null)
        {
            //search the children
            foreach (Control child in control.Controls)
            {
                ctrl = FindControlRecursive(child, id);
                if (ctrl != null) break;
            }
        }
        return ctrl;
    }

Respondido 24 ago 12, 20:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.