1

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

我尝试在一个抽象基类中订阅此用户控件事件,该基类覆盖OnLoad()父页面的事件并让所有父页面都继承自此抽象基类。后面的用户控件代码是:

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。请注意,我有一个 ucPaging id 的用户控件,我在父页面的标记中以声明方式设置

4

1 回答 1

1

FindControl 默认不递归搜索。

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

您可以使用此功能找到它

    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;
    }
于 2012-08-24T19:02:15.473 回答