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

У меня есть веб-пользовательский элемент управления в asp.net - клавиатура. Он имеет кнопки для всех цифр, текстовое поле для отображения ввода и кнопки очистки и отправки. Пользовательский элемент управления находится на панели обновления AJAX, поэтому его можно легко показать / скрыть. (Приложение предназначено для браузеров планшетов) Мне нужно добавить делегата в subMitButton ClickEventHandler внутри моего пользовательского элемента управления на панели обновления AJAX. Какие-либо предложения? Это вообще возможно? Я не хочу использовать мягкую цифровую клавиатуру планшета, потому что она слишком большая. Я мог бы разбить свой пользовательский элемент управления на части и использовать его код на своем веб-сайте, но я бы предпочел использовать пользовательский элемент управления по назначению.

2 ответа

Решение

Вы можете вызвать событие из usercontrol, которое может быть обработано на странице.

Вы можете объявить событие

public event EventHandler SubmitButtonClick;
 protected void OnSubmitButtonClick()
{
    if (SubmitButtonClick!= null)
    {
        SubmitButtonClick(this, new EventArgs());
    }
}

А затем на странице обработать событие.

  WebUserControl1.SubmitButtonClick+= 
    new WebUserControl.EventHandler(WebUserControl1_SubmitButtonClick);
 private void WebUserControl1_SubmitButtonClick(object sender, EventArgs e)
{
    Label1.Text = "Button Pressed";
}

Из-за жизненного цикла веб-страницы ASP.NET я получаю пустые значения, когда задаю общедоступные свойства для пользовательского элемента управления с главной страницы. Эти переменные выходят из области видимости после отправки страницы клиенту. Тем не менее, вот простое решение, которое позволит вам получать уведомления, когда событие происходит в вашем пользовательском элементе управления.

ПРИМЕЧАНИЕ. Возникают некоторые проблемы с Page.Context при возвращении на главную страницу, поэтому изменение параметров, влияющих на состояние просмотра, может не работать.

Внутри моего пользовательского контроля я сделал следующее...

 // UC - setting up delegate and usercontrol property to store it
 public delegate void CallbackAction(object sender, CustomEventArgs e);
 public CallbackAction OnCallbackAction
 {
    get { return Session["CallbackAction"] as CallbackAction;  }
    set { Session["CallbackAction"] = value; }

 }

Где-то в UserControl происходит событие, о котором вы хотите уведомить главную страницу

// UC - callback from within the usercontrol
protected void UserControlButton_Click(object sender, EventArgs e)
{
   if (IsPostback)
   {
      // do some processing
      if (this.OnCallbackAction != null)
      {
         this.OnCallbackAction.Invoke(this, new CustomEventArgs("ET phone home") );
      }
   }

}

Структура выше теперь будет вызывать главную страницу, которая регистрируется в usercontrol. Вот как зарегистрироваться в usercontrol с главной страницы

// Main Page - load event 
protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostback)
   {
      // register with usercontrol
      this.UserControlFoo.OnCallbackAction += CallbackFromUserControl_Click;
   }
}

// Main Page - this event will get called back when ET phones home
protected void CallbackFromUserControl_Click(object sender, CustomEventArgs e)
{
   // phoned home from usercontrol
}
Другие вопросы по тегам