我有一个UserControl,它包含另一个带Button的UserControl。 我想在第一个UserControl(父)中向该按钮添加一个事件。 我试着这样做:
void Page_Init()
{
var btn = ChildControl.FindControl("SearchButton") as Button;
btn.Click += new EventHandler(this.SearchButton_Click);
}
但btn
为空。我怎么能这样做?
答案 0 :(得分:2)
FindControl不会递归搜索目标对象的控件的子节点,因此首先获取嵌套控件,然后通过它的ID搜索按钮的子控件:
var btn = ChildControl.FindControl("NestedControl")
.FindControl("SearchButton") as Button;
btn.Click += new EventHandler(this.SearchButton_Click);
答案 1 :(得分:2)
为什么不在用户控件中创建一个事件,而不是订阅子控件事件,例如:
public event EventHandler<EventArgs> SearchClicked;
protected virtual void OnSearchClicked()
{
if (this.SearchClicked != null)
{
this.SearchClicked.Invoke(this,EventArgs.Empty);
}
}
然后在搜索中点击
调用此项private void btnSearch_Click(object sender,EventArgs e)
{
this.OnSearchClicked();
}
然后您可以在使用用户控件的任何地方订阅此事件
答案 2 :(得分:1)
你应该能够为一个控件提供controlInstance.controls.FindControl(“Searchbutton”),该控件比页面对象下的最终控件低一级。
答案 3 :(得分:0)
因为FindControl不是递归的(如@GenericTypeTea所述),您可以为UserControl创建一个扩展方法,该方法是递归完成此操作,或者在UserControl中提供一个返回按钮作为引用的公共属性。然后你应该可以使用:
ChildControl.MyButtonProperty.Click += new EventHandler(this.SearchButton_Click);
如果这是一个常见问题,那么递归扩展方法在长期运行中可能会更有用。
修改强>
此外,因为您在Page_Init中执行此操作,所以可能无法在子控件中初始化按钮,因为子控件的init在页面的init之后被调用。可能需要在InitComplete事件中执行此操作。