Как главная страница / страница aspx может прослушивать событие, которое отправляется в пользовательском контроле внутри другого пользовательского контроля - PullRequest
1 голос
/ 06 сентября 2011

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

Было бы прощепоменяться ролями?то есть внутренний контроль уведомит свою главную страницу?Я видел это: Справка по прослушиванию событий c # и управлению пользователями

но моя проблема сложнее, я думаю.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2011

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

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

Вы должны быть осторожны с безопасностью потоков и убедиться, что ваши элементы управления правильно распределяют шину событий. Я считаю, что проект ASP.NET WebForms MVP использует такой подход, на который вы могли бы взглянуть.

0 голосов
/ 06 сентября 2011

Попробуйте использовать следующий подход:

Определите событие в вашем UserControl

public delegate void UserControl2Delegate(object sender, EventArgs e);

public partial class UserControl2 : System.Web.UI.UserControl
{
    public event UserControl2Delegate UserControl2Event;

    //Button click to invoke the event
    protected void Button_Click(object sender, EventArgs e)
    {
        if (UserControl2Event != null)
        {
            UserControl2Event(this, new EventArgs());
        }
    }
}

Найдите UserControl в ваших методах Page / Master Load, повторно запустив коллекцию элементов управления и прикрепив обработчик события

UserControl2 userControl2 = (UserControl2)FindControl(this, "UserControl2");
userControl2.UserControl2Event += new UserControl2Delegate(userControl2_UserControl2Event);

...

void userControl2_UserControl2Event(object sender, EventArgs e)
{
    //Do something        
}

...

private Control FindControl(Control parent, string id)
{
    foreach (Control child in parent.Controls)
    {
        string childId = string.Empty;
        if (child.ID != null)
        {
            childId = child.ID;
        }

        if (childId.ToLower() == id.ToLower())
        {
            return child;
        }
        else
        {
            if (child.HasControls())
            {
                Control response = FindControl(child, id);
                if (response != null)
                    return response;
            }
        }
    }

    return null;
}

Надеюсь, это поможет.

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