Назначить обработчик события делегата из динамически добавленного дочернего элемента управления - PullRequest
2 голосов
/ 14 апреля 2010

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

Тогда у меня есть различные типы управления, например, блог, статьи и т. д., каждый из которых может иметь или не иметь добавленный элемент управления комментариями (который выполняется динамически, когда я не знаю идентификаторов), т.е. элемент управления комментариями добавляется за пределы этого элемента управления. Каждый из этих элементов управления обрабатывает свою электронную почту по-разному (отсюда и событие).

Я пытаюсь определить, как назначить событие в родительском элементе управления. В настоящий момент мне приходится рекурсивно искать по всем элементам управления на странице, пока не найду элемент управления комментариями и не настрою его таким образом. Пример ниже объясняет:

КОММЕНТАРИЙ КОНТРОЛЯ

public delegate void Commenting_OnSendEmail();

public partial class Commenting : UserControl
{
   public Commenting_OnSendEmail OnComment_SendEmail();

   private void Page_Load(object sender, EventArgs e)
   {
      if(OnComment_SendEmail != null)
      {
          OnComment_SendEmail();
      }
   }
}

УПРАВЛЕНИЕ РОДИТЕЛЯМИ

public partial class Blog : UserControl
{
   private void Page_Load(object sender, EventArgs e)
   {
      Commenting comControl = (Commenting)this.FindControl<Commenting>(this);
      if(comControl != null)
      {
         comCtrol.OnComment_SendEmail += new Commenting_OnSendMail(Blog_Comment_OnSendEmail);
      }
   }
}

Есть ли более простой способ?

EDIT:

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

1 Ответ

0 голосов
/ 19 апреля 2010

Вы можете переопределить событие AddedControl вашего класса Blog и проверить, является ли добавленный элемент управления экземпляром типа Commenting. Что-то вроде:

public partial class Blog : UserControl { 

    protected override void AddedControl(Control control, int index) {
      base.AddedControl(control, index);

      Commenting commentingControl = control as Commenting;
      if (commentingControl == null) return;

      commentingControl.OnComment_SendEmail += new Commenting_OnSendMail(Blog_Comment_OnSendEmail);
    }
}

Конечно, вы можете поместить этот код в базовый класс всех ваших «комментируемых» пользовательских элементов управления и иметь абстрактный метод для фактической обработки события.

Только одно: событие AddControl происходит ПОСЛЕ Page_Load, поэтому будьте осторожны.

Приветствия

Андре

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