是否可以停止冒泡控制層次結構中的ItemCommand或控件事件?我有一個包含子控件的控件,這些控件可能已經或可能沒有處理其ItemCommand事件的代碼。我想要做的是允許子控件決定不將ItemCommand傳遞給父控件,因爲它已經在其代碼隱藏中處理事件。如何取消ASP.net中的事件冒泡?
感謝,
邁克
是否可以停止冒泡控制層次結構中的ItemCommand或控件事件?我有一個包含子控件的控件,這些控件可能已經或可能沒有處理其ItemCommand事件的代碼。我想要做的是允許子控件決定不將ItemCommand傳遞給父控件,因爲它已經在其代碼隱藏中處理事件。如何取消ASP.net中的事件冒泡?
感謝,
邁克
在您的用戶控件類中,重寫OnBubbleEvent()。如果您返回true,您將停止向上級控件「冒泡」。
protected override bool OnBubbleEvent(object source, EventArgs args)
{
//handled
return true;
//uncomment line below to bubble up (unhandled)
//return base.OnBubbleEvent(source, args);
}
另一個有點整潔的事情去想,我發現雖然擺弄這一點,這可能會在某些情況下是有用的...你可以改變命令名字在控制heirachy是「冒泡」爲好。在你的孩子用戶控件中,使用OnCommand而不是Onclick。
所以,你在你的用戶控件有一個按鈕,更改此代碼:
<asp:button id="mySpecialButton"
onClick="mySpecialButton_OnClick" runat="server">
這樣:
<asp:Button id="mySpecialButton"
CommandName="mySpecialCommand"
CommandArgument="myArgument"
OnCommand="mySpecialButton_Command"
runat="server"/>
然後在代碼隱藏,
protected void mySpecialButton_Command(object sender, CommandEventArgs e)
{
RaiseBubbleEvent(this, new CommandEventArgs("Handled", e));
}
因此,在你的父控件的ItemCommand處理程序中,你將得到這個新的命令名稱,而不是原始命令nam e來自孩子的控制,你可以在你認爲合適的情況下完成。
設置e.Handled = TRUE(如果e是事件的名稱)。
Click事件在技術上不起泡。該事件由您的代碼引發並處理,但列表控件也在觀看Click事件並引發ItemCommand事件。沒有辦法阻止,因爲你甚至不能保證首先會調用哪個事件處理程序。
您是否有與您不想引發該事件的按鈕關聯的CommandName?您應該完全擺脫Button_Click事件,並在ItemCommand事件中執行命令處理,檢查CommandName的事件參數並進行適當的反應。
換句話說,使用標識要發生什麼,然後在ItemCommand事件的CommnadName,只有當你看到一個CommandName的,你是負責處理採取行動。
詹姆斯, 我似乎無法找到你所提到的Handled屬性。目前我正在嘗試在用戶控件的按鈕單擊事件中執行此操作。該方法具有以下簽名: 受保護的子btnAddToCart_Click(BYVAL發件人作爲對象,BYVAL e作爲System.EventArgs)處理btnAddToCart.Click e在這種情況下只是EventArgs,它沒有處理的屬性。是否有其他地方我應該嘗試訪問此屬性? – mclark1129 2009-11-30 22:15:16