5

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

4

2 回答 2

10

您可以从用户控件中引发一个可以在页面中处理的事件。

你可以声明一个事件

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";
}
于 2014-02-25T23:03:06.047 回答
2

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

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

}

上面的结构现在将回调一个向用户控件注册的主页。这是从主页向用户控件注册的方法

// 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
}
于 2015-07-28T19:13:55.720 回答