C#ASP.NET用户控件如何处理div点击服务器端?

我正在创建一个用户控件。 用户控件是一个div,我想向它添加一个click事件。

编辑:

具有此控件的页面必须处理此事件。

我怎样才能做到这一点?

首先,您需要在UserControl上定义一个事件,该事件允许包含UserControl Page注册和处理事件。 例如:

 public partial class MyUserControl : System.Web.UI.UserControl { // Event for page to handle public event EventHandler DivClicked; protected virtual void OnDivClicked(EventArgs e) { if (DivClicked != null) DivClicked(this, e); } protected void Page_Load(object sender, EventArgs e) { // Page Load Code goes here } } 

注意:如果您使用支持回发的控件,则下一部分会更容易。 但是,既然你想使用div ,我将解释如何强制div进行回发。 我要感谢Mathew Nolton的解决方案。

因此,在UserControlPage_Load方法中,您需要添加一个onClick属性来调用ASP.NET的__doPostback() javascript函数,该函数为您的div调用服务器。 这就是div能够回发到服务器的能力。 另外,为了确定哪个控件引起了回发,我提供了divClientId以及一些符号来区分我的回发和其他控件。 请记住,在.ascx文件中定义div时,必须分配一个id并设置runat="server" ,以便在服务器端访问。

好的,现在通过向div添加onclick属性,它会在点击时随时回发到服务器。 因此,当回发导致调用Page_Load ,我会检查是否是导致回发的div 。 如果是这样,我将提升UserControlDivClicked事件由Page处理。

 public partial class MyUserControl : System.Web.UI.UserControl { // Event Definition and Raising methods ... protected void Page_Load(object sender, EventArgs e) { // @@@@ will denote this is an argument I provided. string arg = "@@@@" + divClickableDiv.ClientID; // Add postback method to onClick divClickableDiv.Attributes.Add("onClick", Page.ClientScript.GetPostBackEventReference(divClickableDiv, arg)); if (IsPostBack) { // Get event arguments for post back. string eventArg = Request["__EVENTARGUMENT"]; // Determine if postback is a custom postback added by me. if (!string.IsNullOrEmpty(eventArg) && eventArg.StartsWith("@@@@")) { // Raise the click event for this UserControl if the div // caused the post back. if (eventArg == arg) OnDivClicked(EventArgs.Empty); } } } } 

应该为UserControl执行此操作,现在您DivClicked在页面上注册DivClicked事件即可。

不幸的是,您不会获得设计时间支持来注册活动。 但是,您仍然可以将代码添加到.aspx页面。 在您放弃UserControl的页面上,向UserControl添加一个名为OnXXX的属性,其中XXX是名称事件。 所以,对于我上面的例子,我将在页面上定义我的UserControl ,如下所示:

  

现在,您将处理程序代码添加到Page的代码隐藏文件中(假设您使用的是代码隐藏),如下所示:

 public partial class MyPage : System.Web.UI.Page { // Called whenever div in MyUserControl is clicked. protected void WebUserControl1_DivClicked(object sender, EventArgs e) { // Handle Div click event here. } } 

应该这样做。 我希望这篇文章可以帮到你。

 
...

Rocka的答案很接近,但不太正确(因为它对我不起作用,我想出了原因)。

Rocka的usercontrol的代码位很好://用于处理公共事件的页面事件EventHandler DivClicked;

 protected virtual void OnDivClicked(EventArgs e) { if (DivClicked != null) DivClicked(this, e); } 

使用UserControl时,以下操作无效:

OnDivClicked不是事件处理程序,它是一个函数,因此您无法分配它。 更不用说,当函数触发时,实际的事件处理程序变量为null,因此它不会执行任何操作。

正确的方法是:

这将指定MyUserControl1_DivClicked作为DivClicked的处理程序。 遗憾的是,这实际上并没有起作用,所以在页面的Page_Load上的代码隐藏中,改为:

this.MyUserControl1.OnClick + = new EventHandler(MyUserControl1);

另外,作为旁注,如果你使div为runat =“server”,那么OnClick会被公开为你可以连接的事件。 您需要的只是用户控件中的EventHandler的passthru属性。

在你的ItemTemplate USE asp:Panel INSTEAD OF div标签 (面板呈现为div)并设置Visibility属性,如下所示:

   

代码背后

 Panel ImgFeatured = (Panel)e.Row.FindControl("ImgFeatured"); ImgFeatured.Visible = true;