有没有可能阻止ItemCommand或控件事件冒泡到控件层次结构上面? 我有一个控件,其中包含可能已经具有处理其ItemCommand事件的代码的子用户控件。我想要做的是允许子控件决定不将ItemCommand传递给父控件,如果它已经在其代码后台中处理了该事件。
谢谢,
迈克
有没有可能阻止ItemCommand或控件事件冒泡到控件层次结构上面? 我有一个控件,其中包含可能已经具有处理其ItemCommand事件的代码的子用户控件。我想要做的是允许子控件决定不将ItemCommand传递给父控件,如果它已经在其代码后台中处理了该事件。
谢谢,
迈克
在您的用户控件类中,重写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处理程序中,您将获取此新命令名称而不是来自子控件的原始命令名称,您可以根据需要进行操作。
Click事件在技术上并不是冒泡的。该事件由您的代码引发和处理,但列表控件也在监视Click事件并引发ItemCommand事件。没有办法阻止这种情况,因为您甚至无法保证哪个事件处理程序会首先被调用。
您是否有一个与您不希望引发该事件的按钮相关联的CommandName?您应该完全摆脱Button_Click事件,并在ItemCommand事件中处理您的命令,检查事件参数的CommandName并适当地做出反应。
换句话说,使用标识您想要发生的操作的CommandName,然后在ItemCommand事件中,只有在看到您负责处理的CommandName时才采取行动。
如果 e 是你事件的名称,那么请设置 e.Handled = true。