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

C#ASP.NET用户控件如何处理服务器端的div单击?,c#,asp.net,user-controls,C#,Asp.net,User Controls,我正在创建一个用户控件。用户控件是一个div,我想向它添加一个click事件 编辑: 具有此控件的页面必须处理此事件 如何执行此操作?首先,您需要在用户控件上定义一个事件,该事件允许页面包含用户控件来注册和处理事件。例如: public partial class MyUserControl : System.Web.UI.UserControl { // Event for page to handle public event EventHandler DivClic

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

编辑:

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


如何执行此操作?

首先,您需要在
用户控件
上定义一个事件,该事件允许
页面
包含
用户控件
来注册和处理事件。例如:

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
进行回发。我要感谢您提供了这个解决方案

因此,在
UserControl
Page\u Load
方法中,需要添加一个
onClick
属性来调用ASP.NET的
\u doPostback()
javascript函数,该函数为
div
调用服务器。这就是使
div
能够回发到服务器的原因。此外,为了确定是哪个控件导致了回发,我提供了
div
ClientId
以及一些符号来区分回发与其他控件。记住,在.ascx文件上定义
div
时,必须分配
id
,并设置
runat=“server”
,以便在服务器端访问

好的,现在通过将
onclick
属性添加到
div
,它将在任何时候单击后发回服务器。因此,当回发导致调用
Page\u Load
时,我检查是否是
div
导致了回发。如果是这样,我将引发页面要处理的
UserControl
DivClicked
事件

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
事件

遗憾的是,您无法获得设计时支持来注册该活动。但是,您仍然可以将代码添加到.aspx页面。在放置
UserControl
的页面上,向名为
OnXXX
UserControl
添加一个属性,其中XXX是name事件。因此,对于上面的示例,我将在页面上定义我的
UserControl
,如下所示:

<uc1:MyUserControl  ID="MyUserControl1" runat="server" OnDivClicked="MyUserControl1_DivClicked" />
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.
    }
}
应该这样做。我希望这篇文章能帮助你。


<div runat="server" onserverclick="MyClickHandler">
...
</div>
...
罗卡的答案很接近,但并不完全正确(因为它对我不起作用,我找到了原因)

Rocka用户控件的代码位很好: //要处理的页的事件 公共事件事件处理程序

protected virtual void OnDivClicked(EventArgs e) 
{ 
    if (DivClicked != null) 
        DivClicked(this, e); 
} 
使用UserControl时,以下操作将不起作用:

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

正确的方法是:

这会将MyUserControl1\u DivClicked指定为DivClicked的处理程序。遗憾的是,这实际上不起作用,因此在页面页面加载的代码中,将以下行改为:

this.MyUserControl1.OnClick+=新事件处理程序(MyUserControl1)


另外,作为旁注,如果您使div在runat=“server”上运行,那么OnClick将作为一个您本可以连接到的事件公开。您所需要的只是用户控件中EventHandler到div的passthru属性。

在ItemTemplate中,使用asp:Panel而不是div标记(面板呈现为div),并设置可见性属性,如下所示:

<asp:Panel ID="ImgFeatured" runat="server" CssClass="featured-ribbon"> </asp:Panel>

哇,多好的解释啊!非常有趣的东西!非常感谢你!没问题。很高兴我能帮忙这是真的吗?与冲突
Panel ImgFeatured = (Panel)e.Row.FindControl("ImgFeatured");
ImgFeatured.Visible = true;