![](/img/trans.png)
[英]How to add an on click event in server side for an Image control in C#/ASP.NET
[英]C# ASP.NET User control How to handle a div click server side?
我正在創建一個用戶控件。 用戶控件是一個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的解決方案。
因此,在UserControl
的Page_Load
方法中,您需要添加一個onClick
屬性來調用ASP.NET的__doPostback()
javascript函數,該函數為您的div
調用服務器。 這就是div
能夠回發到服務器的能力。 另外,為了確定哪個控件引起了回發,我提供了div
的ClientId
以及一些符號來區分我的回發和其他控件。 請記住,當您在.ascx文件上定義div
時,必須分配一個id
並設置runat="server"
,以便在服務器端訪問。
好的,現在通過向div
添加onclick
屬性,它會在點擊時隨后回發到服務器。 因此,當回發導致Page_Load
被調用時,我檢查是否是導致回發的div
。 如果是這樣,我將提升UserControl
的DivClicked
事件由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
,如下所示:
<uc1:MyUserControl ID="MyUserControl1" runat="server" OnDivClicked="MyUserControl1_DivClicked" />
現在,您將處理程序代碼添加到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.
}
}
應該這樣做。 我希望這篇文章可以幫到你。
<div runat="server" onserverclick="MyClickHandler">
...
</div>
在你的ItemTemplate USE asp:Panel 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;
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屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.