Как я могу получить свой пользовательский элемент управления, чтобы знать, когда родитель слышит пользовательский элемент управления событие OnHide? - PullRequest
1 голос
/ 17 февраля 2009

У меня есть страница asp.net с панелью задач сбоку. Нажатие на задачу открывает пользовательский элемент управления для этой задачи с некоторыми элементами управления и кнопкой закрытия.

Как запустить код C #, когда пользовательский элемент управления скрыт, нажав кнопку закрытия?

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

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

Все, чего я действительно хочу добиться, - это запускать некоторый код C # только при закрытом элементе управления, который фактически скрывает его. Есть ли что-то аналогичное Page_Closing / Hiding? Я не могу найти это, если есть.

Есть ли способ достичь этого?

РЕДАКТИРОВАТЬ: Я должен отметить, что я нашел событие OnHide для элемента управления, но код для этой логики действительно должен быть в элементах управления, а не на страницах. Главным образом потому, что должно происходить, когда элемент управления скрыт, задайте некоторый текст в элементе управления, чтобы при последующей его загрузке он отображал правильную информацию.

РЕДАКТИРОВАТЬ: Спасибо за все идеи. Я до сих пор не могу решить проблему, что предложил teedyay ...

«Если вы не хотите обрабатывать этот код на странице, создайте свою собственную версию элемента управления, унаследованную от оригинала. Вы можете обрабатывать событие OnHide там более автономно».

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


Обновление: Я думаю, что шаг назад и более ясное изложение того, чего я хочу достичь, может прояснить ситуацию.

У меня есть пользовательский элемент управления, который представляет собой плавающую панель, которая находится над моей главной страницей. Он наследуется от элемента управления, для которого у меня нет кода. Этот элемент управления генерирует URL-адреса (по запросу пользователя) и отображает их в элементе управления, а также отображает историю последних 3 сгенерированных URL-адресов.

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

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

Ответы [ 4 ]

1 голос
/ 17 февраля 2009

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

1 голос
/ 17 февраля 2009

Событие Page_Unload не будет вам полезно: это происходит в конце жизненного цикла страницы на сервере, т. Е. До того, как содержимое страницы будет отправлено клиенту.

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

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

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

0 голосов
/ 17 февраля 2009

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

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

Если вы не хотите обрабатывать свои действия вне пользовательского контроля на самой странице, вы можете просто добавить пользовательское событие (как предложил Middletone). Вот как это будет работать в коде:

/// <summary>
/// This is the Event Delegate
/// </summary>
public delegate void MyEventHandler(object sender, EventArgs e);

/// <summary>
/// This event is thrown when <...>
/// </summary>
public event MyEventHandler NewMyEvent;

/// <summary>
/// Internal event that triggers the external events
/// </summary>
/// <param name="e"></param>
private void OnNewMyEvent(EventArgs e)
{
    if (NewMyEvent != null)
        NewMyEvent(this, e);
}

Теперь, когда вы хотите, чтобы событие было сгенерировано (например, когда обработка кнопки закрытия закончена), просто позвоните

NewMyEvent(new EventArgs());

и все готово. В этом случае вы бы позвонили после установки команды hide.

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

0 голосов
/ 17 февраля 2009

В пользовательском элементе управления есть несколько методов, которые вы можете переопределить, в частности:

protected override void OnUnload(EventArgs e) {

    // Insert custom code here

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