2009-11-30 25 views
8

是否可以停止冒泡控制層次結構中的ItemCommand或控件事件?我有一個包含子控件的控件,這些控件可能已經或可能沒有處理其ItemCommand事件的代碼。我想要做的是允許子控件決定不將ItemCommand傳遞給父控件,因爲它已經在其代碼隱藏中處理事件。如何取消ASP.net中的事件冒泡?

感謝,

邁克

回答

11

在您的用戶控件類中,重寫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來自孩子的控制,你可以在你認爲合適的情況下完成。

0

設置e.Handled = TRUE(如果e是事件的名稱)。

+0

詹姆斯, 我似乎無法找到你所提到的Handled屬性。目前我正在嘗試在用戶控件的按鈕單擊事件中執行此操作。該方法具有以下簽名: 受保護的子btnAddToCart_Click(BYVAL發件人作爲對象,BYVAL e作爲System.EventArgs)處理btnAddToCart.Click e在這種情況下只是EventArgs,它沒有處理的屬性。是否有其他地方我應該嘗試訪問此屬性? – mclark1129 2009-11-30 22:15:16

1

Click事件在技術上不起泡。該事件由您的代碼引發並處理,但列表控件也在觀看Click事件並引發ItemCommand事件。沒有辦法阻止,因爲你甚至不能保證首先會調用哪個事件處理程序。

您是否有與您不想引發該事件的按鈕關聯的CommandName?您應該完全擺脫Button_Click事件,並在ItemCommand事件中執行命令處理,檢查CommandName的事件參數並進行適當的反應。

換句話說,使用標識要發生什麼,然後在ItemCommand事件的CommnadName,只有當你看到一個CommandName的,你是負責處理採取行動。

+0

在Click事件的問題中沒有提及,但是ItemCommand的問題。哪個*做泡沫。摩根的答案顯示瞭如何處理這個問題。 – Ruben 2009-12-09 09:33:41

+0

在JamesL的回答後面提到了它。是的,摩根的答案是更好的,因此它被選中了。 StackOverflow按設計工作。 – Josh 2009-12-09 12:15:24