簡體   English   中英

C#ASP.NET用戶控件如何處理div點擊服務器端?

[英]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的解決方案。

因此,在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 ,如下所示:

<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM