我正在创建一个用户控件。用户控件是一个div,我想向它添加一个click事件。
编辑:
具有此控件的页面必须处理此事件。
我该怎么做?
答案 0 :(得分:9)
首先,您需要在UserControl
上定义一个事件,该事件允许包含Page
的{{1}}注册并处理该事件。例如:
UserControl
注意:
如果您使用支持回发的控件,下一部分会更容易。但是,由于您要使用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
进行回发。我要感谢Mathew Nolton这个解决方案。
因此,在div
的{{1}}方法中,您需要添加Page_Load
属性来调用ASP.NET的UserControl
javascript函数,该函数会为您调用服务器onClick
。这使__doPostback()
能够回发到服务器。另外,为了确定哪个控件引起了回发,我提供了div
的{{1}}以及一些符号来区分我的回发和其他控件。请记住,当您在.ascx文件上定义div
时,必须分配div
并设置ClientId
才能在服务器端访问。
好的,现在通过向div
添加id
属性,只要点击它就会回发到服务器。因此,当回发导致runat="server"
被调用时,我会检查是否是导致回发的onclick
。如果是这样,我会将div
的{{1}}事件提升为由Page处理。
Page_Load
应该为div
执行此操作,现在您只需在页面上注册UserControl
事件。
不幸的是,您无法获得设计时间支持来注册该活动。但是,您仍然可以将代码添加到.aspx页面。在您放弃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);
}
}
}
}
的{{1}}添加属性,其中XXX是名称事件。所以,对于我上面的例子,我将在页面上定义我的UserControl
看起来像这样:
DivClicked
现在您将处理程序代码添加到UserControl
的代码隐藏文件中(假设您使用代码隐藏),如下所示:
UserControl
应该这样做。我希望这篇文章可以帮助你。
答案 1 :(得分:1)
<div runat="server" onserverclick="MyClickHandler">
...
</div>
答案 2 :(得分:0)
Rocka的答案很接近,但不太正确(因为它对我不起作用,我想出了原因)。
Rocka用户控件的代码位很好: //要处理的页面的事件 公共事件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属性。
答案 3 :(得分:0)
在你的ItemTemplate中 USE asp:面板INSTEAD OF div标签(面板呈现为div)并设置Visibility属性,如下所示:
<asp:Panel ID="ImgFeatured" runat="server" CssClass="featured-ribbon"> </asp:Panel>
背后的代码
Panel ImgFeatured = (Panel)e.Row.FindControl("ImgFeatured");
ImgFeatured.Visible = true;