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

У меня проблема с настройкой события в форме. Вот настройки:

Мне дали страницу с двумя элементами управления, двумя разными версиями формы, которую конечный пользователь мог заполнить - стандартный и расширенный. Эти две формы имеют различный код и javascript, поэтому оригинальный разработчик поместил их в отдельные веб-элементы управления. Помимо элементов управления есть LinkButton, который переключается в расширенный режим.

<uc1:Standard runat="server" ID="StandardForm" />
<uc1:Advanced runat="server" ID="AdvancedForm" />
<asp:LinkButton runat="server" ID="lnkAdvanced" Text="Go To Advanced" OnClick="lnkAdvanced_Click" />

lnkAdvanced_Click просто берет всю информацию, введенную в данный момент, в расширенный и переворачивает Visible.

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

Я пытался настроить событие так:

public event EventHandler AdvanceClick;

protected void lnkAdvanced_Click(object sender, EventArgs e) {
    AdvanceClick(sender, e);
}

И когда это не сработало, я попытался создать делегата:

public delegate void AdvancedEventHandler(object sender, EventArgs e);
public event AdvancedEventHandler AdvanceClick;

Когда я переместил кнопку в стандартную форму, я ожидал, что смогу напечатать что-то вроде:

StandardForm.AdvanceClick += new AdvancedEventHandler(GoToAdvanced);

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

Ответы [ 3 ]

1 голос
/ 22 февраля 2009
// in your Standard user control
public event EventHandler AdvancedClick;

private void lbtnAdvanced_Click(object sender, EventArgs e)
{
    OnAdvancedClick(e);
}

protected void OnAdvancedClick(EventArgs e)
{
    if (AdvancedClick != null)
        AdvancedClick(this, e);
}

// on your page
StandardForm.AdvancedClick += new EventHandler(StandardForm_AdvancedClick);

private void StandardForm_AdvancedClick(object sender, EventArgs e)
{
    // toggle logic here
}
0 голосов
/ 22 февраля 2009

Если в стандартной форме есть кнопка «Перейти в расширенный». Затем, очевидно, он должен знать о расширенной форме, и, таким образом, они кажутся довольно тесно связанными. Если это так, то мне кажется, что вы могли бы просто иметь расширенную форму как потомок стандартной формы, а затем ... или еще лучше, объединить их в один элемент управления.

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

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

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

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

Вам не нужен делегат, потому что вы создали стандартное событие.

Попробуйте в своей форме загрузить или около этого:

StandardForm.AdvanceClick += new EventHandler(GoToAdvanced);

Затем где-то на странице, на которой размещены 2 пользовательских элемента управления

protected void GoToAdvanced(object sender, EventArgs e)
{
    //Code that was previously in lnkAdvanced_Click on page.
}

Edit:

Звучит так, будто установка неверна.

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

Тогда мы также предполагаем, что событие AdvanceClick объявлено в стандартном UC, но в сообщении об ошибке будет указано, что это не так, а метод lnkAdvanced_Click находится в стандартном UC?

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

Если бы вы могли подтвердить или опровергнуть предположения, я уверен, что мы могли бы это выяснить.

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