C#ASP.NET用户控件如何处理服务器端的div单击?
我正在创建一个用户控件。用户控件是一个div,我想向它添加一个click事件 编辑: 具有此控件的页面必须处理此事件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
如何执行此操作?首先,您需要在
用户控件
上定义一个事件,该事件允许页面
包含用户控件
来注册和处理事件。例如:
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;