我有一个带有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,我在声明页面的标记中以声明方式设置
答案 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;
}