2009-11-30 2 views
8

Возможно ли остановить событие ItemCommand или control из пузырьков иерархии управления? У меня есть элемент управления, который содержит дочерние элементы управления пользователя, которые могут или не могут иметь код, который обрабатывает их события 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

Set e.Handled = истина (если е название вашего мероприятия).

+0

James, Возможно, я не могу найти свойство Handled, о котором вы упоминаете. В настоящее время я пытаюсь сделать это внутри события нажатия кнопки пользовательского элемента управления. Метод имеет следующую подпись: Protected Sub btnAddToCart_Click (ByVal отправитель As Object, ByVal е Как System.EventArgs) Ручки btnAddToCart.Click е в этом случае просто EventArgs и не имеет свойства обрабатывается. Где-то еще я должен пытаться получить доступ к этому свойству? – mclark1129

1

Событие Click технически не пузырится. Это событие возникает и обрабатывается вашим кодом, но элемент управления списком также просматривает событие Click и вызывает событие ItemCommand. Невозможно предотвратить это, потому что вы даже не можете гарантировать, какой обработчик будет вызван первым.

У вас есть CommandName, связанное с кнопкой, в которой вы не хотите поднимать это событие? Вероятно, вы должны полностью избавиться от своего события Button_Click и выполнять свою обработку команд в событии ItemCommand, проверяя аргументы событий для CommandName и реагируя соответствующим образом.

Другими словами, используйте CommandName, которое идентифицирует то, что вы хотите, а затем в событии ItemCommand принимайте меры только тогда, когда вы видите CommandName, за которое вы несете ответственность за обработку.

+0

В вопросе события Click нет упоминания, кроме ItemCommand. Который * делает * пузырь. Ответ Моргана показывает, как справиться с этим. – Ruben

+0

Было упомянуто в ответе Джеймса. Да, ответ Моргана лучше, поэтому он проголосовали. StackOverflow работает так, как было разработано. – Josh