ASP.NET делегирование событий между пользовательскими элементами управления - PullRequest
2 голосов
/ 31 марта 2010

Укажите следующую иерархию элементов управления на странице ASP.NET:

  • Страница
    • HeaderControl ( Контроль пользователя )
      • TitleControl ( Управление сервером )
    • TabsControl ( Контроль пользователя )
    • другие элементы управления

Я пытаюсь вызвать событие (или какое-либо уведомление) в TitleControl, которое всплывает до уровня Page. Затем я хотел бы (необязательно) зарегистрировать обработчик событий на странице кода с кодом , который будет принимать EventArgs и изменить TabsControl в приведенном выше примере. Важно отметить, что этот дизайн позволит мне перетащить эти элементы управления на любую страницу и обеспечить бесперебойную работу всей системы, если обработчик событий подключен. Решение не должно включать вызов FindControl(), так как это становится сильной ассоциацией. Если обработчик не определен на содержащей странице, событие все еще вызывается TitleControl, но не обрабатывается.

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

Вот мои (плохие) попытки:

  1. Использование HttpContext.Current.Items

    Добавьте EventArgs в коллекцию Items в TitleControl и выберите его в TabsControl. Это работает, но принципиально трудно расшифровать, так как связь между двумя элементами управления не очевидна.

  2. Использование отражения

    Вместо передачи событий ищите функцию на странице контейнера непосредственно в TitleControl, как в: Page.GetType().GetMethod("TabControlHandler").Invoke(Page, EventArgs); Это будет работать, но имя метода должно быть константой, что все Page экземпляров должны будут определяться дословно.

Я уверен, что я обдумываю это, и должно быть более красивое решение с использованием делегирования, но я не могу думать об этом. Есть мысли?

Ответы [ 4 ]

1 голос
/ 31 марта 2010

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

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

Ваш HeaderControl ссылается на ваш TitleControl и обрабатывает его события. Если он не полностью обрабатывает ваши TitleControl события, то должен объявить и запустить собственное событие , а также передать исходный отправитель и аргументы события.

На уровне вашей страницы ваша страница будет обрабатывать события HeaderControl. Поскольку ваша страница также является контейнером для вашего TabsControl, вызовите открытый метод в вашем TabsControl внутри обработчика событий для вашего события HeaderControl и передайте всплывающую информацию EventArg.

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

0 голосов
/ 31 марта 2010

HeaderControl может отображать событие, которое потребляется TabsControl. Я отвечал на подобный вопрос раньше (с приложенным примером проекта).

0 голосов
/ 31 марта 2010

У вас может быть страница, реализующая интерфейс, в котором есть события. Затем настройте вкладку, чтобы увидеть, внедряет ли страница нужный интерфейс. Если это так, то подключитесь к событиям.

Пропущена часть о контроле над заголовком. Элемент управления заголовком также должен был бы заявить о себе странице через интерфейсный метод.

Затем вы можете подключить события в некоторый момент (возможно, событие загрузки). Это, конечно, будет работать только в том случае, если элементы управления добавлены на страницу до события загрузки.

0 голосов
/ 31 марта 2010

Вы пытаетесь что-то сделать по этим строкам ?

...