ASP.NET Как два динамически загружаемых пользовательских элемента управления могут реагировать на события друг друга?

Приветствую всех, у меня есть два ascx, загруженных в событие page-init страницы aspx. Элемент управления 1 имеет список переключателей, который я хочу, чтобы раскрывающийся список элемента управления 2 реагировал на его изменение selectedIndex. Пока я вызываю RaiseBubbleEvent в обработчике SelectedIndexChange и передаю ссылку на элемент управления и commandArgs. Затем в aspx я переопределяю OnBubbleEvent и могу получить ссылку на элемент управления и commandArgs. Мой вопрос: как передать эту информацию в Control 2. Страница не знает об элементах управления, поскольку они загружаются динамически и добавляются в asp: PlaceHolders в aspx. Мне нужен элемент управления 2, чтобы знать, какой переключатель был выбран, чтобы я мог изменить источник данных для раскрывающегося списка элемента управления 2. Есть ли у кого-нибудь примеры чего-то вроде этого? Любые указатели или подсказки будут оценены.

Спасибо, ~ ck в Сан-Диего


person Hcabnettek    schedule 21.08.2009    source источник


Ответы (3)


Что ж, элемент управления 2 действительно должен просто присоединяться к событию SelectedIndexChanged другого элемента управления. По какой-то причине это невозможно?

person Noon Silk    schedule 21.08.2009

Я не уверен, что это очень хорошее решение, но оно должно работать. Создайте обработчик для события в элементе управления 2 и получите некоторый способ доступа к делегату этого обработчика. Затем просто подключите событие элемента управления 1 к обработчику, возвращаемому этим методом доступа. Очень грубый пример:

В control1:

public event SelectedIndexChanged;

public void PageLoad()
{
    radioList.SelectedIndexChanged += new EventHandler(RadSelectedIndexChanged);
}

public void RadSelectedIndexChanged(object sender, EventArgs args)
{
    SelectedIndexChanged(sender, args);
}

На странице aspx:

control1.SelectedIndexChanged += control2.GetHandler();

В контроле2:

public EventHandler GetHandler()
{
    return new EventHandler(HandleEvent);
}

protected void HandleEvent(object sender, EventArgs args)
{

}
person Simon Fox    schedule 21.08.2009

Поскольку вы упомянули, что страница не знает об этих элементах управления, лучше всего иметь класс Control1 для предоставления интерфейса с помощью метода установки I-want-to-listen-to-your-event.

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

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

Изменить:

Добавлен образец веб-приложения для загрузки. Исходный код опубликован в открытом доступе.

person devstuff    schedule 21.08.2009
comment
Мне нравится эта идея. Как мне создать интерфейс с помощью метода установки «Я хочу-слушать-ваше-событие»? Когда вы говорите сеттер, вы имеете в виду свойство {set;} и ​​тип, который должен возвращать метод. Прошу прощения, я немного новичок в кодировании событий. Спасибо. - person Hcabnettek; 21.08.2009
comment
@Kettenbach: добавлен образец приложения. - person devstuff; 21.08.2009