2009-11-30 4 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에서 '버블'고 명령 이름을 변경할 수 있습니다 동안 내가 발견에 대해 생각하는 또 다른 다소 깔끔한 것. 자식 사용자 정의 컨트롤에서 OnClick 대신 OnCommand를 사용하십시오. 이것에

<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

James, 언급 한 Handled 속성을 찾을 수없는 것 같습니다. 현재 사용자 정의 컨트롤의 단추 클릭 이벤트 내부에서이를 수행하려고합니다. 이 메서드는 다음과 같은 서명이 있습니다. Protected Sub btnAddToCart_Click (ByVal 보낸 사람이 Object, ByVal e As System.EventArgs) 핸들 btnAddToCart.Click 이 경우 이벤트는 단지 EventArgs이고 처리 된 속성은 없습니다. 이 부동산에 액세스하려고해야하는 다른 곳이 있습니까? – mclark1129

1

Click 이벤트는 기술적으로 버블 링되지 않습니다. 이 이벤트는 코드에 의해 발생되고 처리되지만 목록 컨트롤은 Click 이벤트를보고 ItemCommand 이벤트를 발생시킵니다. 첫 번째로 호출 할 이벤트 핸들러를 보장 할 수 없기 때문에이를 방지 할 수있는 방법이 없습니다.

해당 이벤트를 발생시키지 않으려는 버튼에 CommandName이 연결되어 있습니까? 아마도 Button_Click 이벤트를 완전히 없애고 CommandCommand 이벤트에서 명령을 처리하고 CommandName에 대한 이벤트 인수를 확인한 다음 적절하게 반응해야합니다.

즉, 수행 할 작업을 식별하는 CommandName을 사용하고 ItemCommand 이벤트에서 처리를 담당하는 CommandName 만 볼 때 작업을 수행하십시오.

+0

Click 이벤트에 대한 언급은 없지만 ItemCommand에 대한 언급은 없습니다. * 거품을 일으 킵니다. 모건의 대답은 이것을 어떻게 다루는 지 보여줍니다. – Ruben

+0

JamesL의 답변에 대한 후속 조치에서 언급되었습니다. 그렇습니다. Morgan의 대답은 더 좋습니다. StackOverflow가 설계된대로 작동합니다. – Josh

관련 문제