订阅多个页面中的单个usercontrol事件,asp.net 4.0

时间:2012-08-24 18:54:23

标签: asp.net user-controls

我有一个带有asp.net服务器端按钮控件的用户控件。我在多个页面上使用此用户控件。我在usercontrol的按钮单击事件上引发自定义事件。使用此usercontrol的所有父页面都应该收到我从usercontrol引发的自定义事件的通知。除了在所有父页面中订阅此事件之外,我是否有一种简单的方法可以在父页面中收到此自定义事件的通知?

我尝试在抽象基类中订阅此usercontrol事件,该基类覆盖父页面的OnLoad()事件,并使所有父页面都从此抽象基类继承。后面的Usercontrol代码是:

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);


            }
        }

  }

抽象基类是:

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);


    }

但是this.FindControl("ucPaging")块返回null。请注意,我有一个idc为ucPaging的usercontrol,我在声明页面的标记中以声明方式设置

1 个答案:

答案 0 :(得分:1)

默认情况下,FindControl不会递归搜索。

因此,除非您的ucPaging控件直接添加到实现抽象类的控件集合中,否则您将获得null。

您可以使用此功能找到它

    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;
    }