Добавить делегат события в обработчик событий пользовательского элемента управления 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
}