ASP.net中如何取消事件冒泡?

8

有没有可能阻止ItemCommand或控件事件冒泡到控件层次结构上面? 我有一个控件,其中包含可能已经具有处理其ItemCommand事件的代码的子用户控件。我想要做的是允许子控件决定不将ItemCommand传递给父控件,如果它已经在其代码后台中处理了该事件。

谢谢,

迈克

3个回答

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);
    }

在调试时我找到了一个有趣的东西,可能会在某些情况下很有用......你还可以更改在控制层次结构中“冒泡”的命令名称。 在子用户控件中,使用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

Click事件在技术上并不是冒泡的。该事件由您的代码引发和处理,但列表控件也在监视Click事件并引发ItemCommand事件。没有办法阻止这种情况,因为您甚至无法保证哪个事件处理程序会首先被调用。

您是否有一个与您不希望引发该事件的按钮相关联的CommandName?您应该完全摆脱Button_Click事件,并在ItemCommand事件中处理您的命令,检查事件参数的CommandName并适当地做出反应。

换句话说,使用标识您想要发生的操作的CommandName,然后在ItemCommand事件中,只有在看到您负责处理的CommandName时才采取行动。


问题中没有提到 Click 事件,而是 ItemCommand。它确实会冒泡。Morgan 的答案展示了如何处理这个问题。 - Ruben
在对JamesL的回答进行跟进时提到了这一点。是的,Morgan的回答更好,因此被投票支持。StackOverflow正在按设计工作。 - Josh

-1

如果 e 是你事件的名称,那么请设置 e.Handled = true。


詹姆斯,我似乎找不到你提到的Handled属性。目前我正在尝试在用户控件的按钮单击事件中执行此操作。该方法具有以下签名:Protected Sub btnAddToCart_Click(ByVal sender As Object,ByVal e As System.EventArgs)Handles btnAddToCart.Click在这种情况下,e只是EventArgs,并且它没有handled属性。我应该在其他地方尝试访问此属性吗? - mclark1129

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接