Как отменить всплытие событий в ASP.net? - PullRequest
8 голосов
/ 01 декабря 2009

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

Спасибо

Mike

Ответы [ 3 ]

11 голосов
/ 04 декабря 2009

В вашем пользовательском классе управления переопределите 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);
    }

Еще одна несколько изящная вещь, о которой я подумал, обнаруженная во время работы над этим, что может быть полезно в некоторых случаях ... вы можете изменить имя команды, которое «всплывает» в иерархии управления. В вашем дочернем пользовательском элементе управления используйте 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 вашего родительского элемента управления вы получите новое имя команды, а не исходное имя команды из дочернего элемента управления, которое вы можете делать по своему усмотрению.

1 голос
/ 03 декабря 2009

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

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

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

0 голосов
/ 01 декабря 2009

Установите e.Handled = true (если e - название вашего события).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...