【问题标题】:VB/ASP.NET Fire events across WebPartsVB/ASP.NET 跨 WebPart 触发事件
【发布时间】:2010-10-06 15:46:55
【问题描述】:
首先,我的环境:
VB.NET .NET 2.0
AJAX 更新面板也用于 webpart 区域。
我有一个母版页和默认页。
默认页面有 WPM 和两个区域。
每个 webpart 只是一个外壳,一个用户控件用于 A & B
我有两个 webpart,A 和 B。(用户控件)- A 有许多按钮。
B 有一个列表框和 Subs,它填充列表框并刷新也位于(在 Web 部分 B 内)包装列表框的 UpdatePanel。
我想单击 webpart A 中的一个按钮,它会在 webpart B 中触发一个名为“Public Sub FillList()”的子,我似乎无法锻炼如何做到这一点。
我查看了 webpart 连接,我知道我可以传递属性,这很好,但我想调用 subs/fire 事件。
提前致谢!
【问题讨论】:
标签:
asp.net
vb.net
web-parts
【解决方案1】:
这听起来像是“event bubbling”的案例。
事件冒泡允许某个容器的组成控件使其事件“冒泡”或提升以由父(容器)控件处理。
Webpart A 中的按钮控件的点击事件中可以包含以下代码:
RaiseBubbleEvent(Me, args)
其中 args 是派生自 System.EventArgs 的一些自定义类型。然后,这将在父容器(在您的情况下为 UserControl 本身)上引发(或“冒泡”)事件(使用您的自定义参数)。这是在父容器上的以下事件中处理的:
Protected Overrides Function OnBubbleEvent(ByVal source As Object, ByVal args As System.EventArgs) As Boolean
这可以在您的网页中沿包含层次结构重复(页面是最终容器)。一旦此事件到达作为您的两个用户控件(A 和 B)的父容器的容器,您就可以从父容器的代码中调用 UserControl B 上的公共方法,如果您愿意,可以传入自定义事件参数。
【解决方案2】:
我知道它有点脏,但我找到了一个可行的解决方案:
MyControlThatNeedsUpdated grid = (MyControlThatNeedsUpdated)FindControlRecursive(Page, "MyControlThatNeedsUpdated");
grid.updateList();
private Control FindControlRecursive(Control root, string ControlType)
{
if (root.GetType().Name == ControlType)
{
return root;
}
foreach (Control c in root.Controls)
{
Control t = FindControlRecursive(c, ControlType);
if (t != null)
{
return t;
}
}
return null;
}
我调用的方法是'updateList()'