ASP.NET Как 2 динамически загружаемых пользовательских элемента управления реагируют на события друг друга? - PullRequest
0 голосов
/ 21 августа 2009

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

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

Ответы [ 3 ]

0 голосов
/ 21 августа 2009

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

0 голосов
/ 21 августа 2009

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

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

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

Edit:

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

0 голосов
/ 21 августа 2009

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

В контроле1:

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)
{

}
...