将UserControl中的事件添加到嵌套UserControl中的按钮

时间:2010-12-08 11:33:17

标签: c# asp.net events user-controls

我有一个UserControl,它包含另一个带Button的UserControl。 我想在第一个UserControl(父)中向该按钮添加一个事件。 我试着这样做:

void Page_Init()
{
    var btn = ChildControl.FindControl("SearchButton") as Button;
    btn.Click += new EventHandler(this.SearchButton_Click);
}

btn为空。我怎么能这样做?

4 个答案:

答案 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事件中执行此操作。