将事件委托添加到ASP.NET用户控件的事件处理程序

时间:2014-02-25 22:21:40

标签: c# asp.net webforms web-user-controls

我在asp.net中有一个Web用户控件 - 一个键盘。它具有所有数字的按钮,用于显示输入的文本框以及清除和提交按钮。用户控件位于AJAX更新面板中,因此可以轻松显示/隐藏。 (应用程序用于平板电脑浏览器)我需要在AJAX更新面板内的用户控件中添加一个委托给subMitButton ClickEventHandler。有什么建议?它甚至可能吗?我不想使用平板电脑的软数字键盘,因为它是大的方式。我可以分开我的用户控件并在我的网站中使用它的代码,但我宁愿按预期使用用户控件。

2 个答案:

答案 0 :(得分:9)

您可以从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";
}

答案 1 :(得分:1)

由于ASP.NET网页生命周期,当我从主页面设置用户控件的公共属性时,我得到Null。页面发送到客户端后,这些变量超出范围。但是,这是一个简单的解决方案,可以让您在用户控件中发生事件时收到通知。

注意:返回主页时,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
}