Добавить событие в UserControl к кнопке, которая находится во вложенном UserControl - PullRequest
1 голос
/ 08 декабря 2010

У меня есть UserControl, который содержит другой UserControl с кнопкой. Я хочу добавить событие к этой кнопке в первом UserControl (родительском). Я пытался сделать:

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

но btn равно нулю. Как я могу это сделать?

Ответы [ 4 ]

2 голосов
/ 08 декабря 2010

Вместо того, чтобы подписываться на события дочернего элемента управления, почему бы не создать событие в вашем пользовательском элементе управления, например:

public event EventHandler<EventArgs> SearchClicked;

protected virtual void OnSearchClicked()
{
     if (this.SearchClicked != null)
     {
         this.SearchClicked.Invoke(this,EventArgs.Empty);
     }
}

, а затем вызвать его при поиске.можете подписаться на это событие, где бы вы ни использовали пользовательский элемент управления

2 голосов
/ 08 декабря 2010

FindControl не рекурсивно ищет дочерние элементы управления целевого объекта, поэтому сначала получите вложенный элемент управления, а затем найдите его дочерние элементы управления для кнопки по ее идентификатору:

var btn = ChildControl.FindControl("NestedControl")
    .FindControl("SearchButton") as Button;

btn.Click += new EventHandler(this.SearchButton_Click);
1 голос
/ 08 декабря 2010

Вы должны иметь возможность сделать controlInstance.controls.FindControl ("Searchbutton") для элемента управления, который находится на один уровень ниже конечного элемента управления, который находится под объектом страницы.

0 голосов
/ 08 декабря 2010

Поскольку FindControl не является рекурсивным (как упоминается @ GenericTypeTea ), вы можете либо создать метод расширения для UserControl, который является рекурсивным для достижения этой цели, либо предоставить открытое свойство в вашем UserControl, которое возвращает кнопку какссылка.Тогда вы сможете использовать:

ChildControl.MyButtonProperty.Click += new EventHandler(this.SearchButton_Click);

Метод рекурсивного расширения может быть более полезным в долгосрочной перспективе, если это общая проблема.

Редактировать Кроме того, поскольку вы делаете это в Page_Init, кнопка не может быть инициализирована в дочернем элементе управления, так как init дочернего элемента управления вызывается после init страницы.Может потребоваться выполнить это действие в событии InitComplete.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...