2009-02-10 64 views
2

首先,我的环境: VB.NET .NET 2.0 AJAX更新面板也用于webpart区域。 我有一个母版页和默认页面。 默认页面有WPM和两个区域。 每个web部件仅仅是一个外壳和一个用户控件被用于&乙跨Web部件的VB/ASP.NET火灾事件

我有两个的WebParts,A & B.(用户控件) - A具有多个按钮。 B有一个列表框&将填充列表框并刷新UpdatePanel的子节点,它也位于包装列表框的webpart B内部。 我想单击webpart A中的一个按钮,它会触发一个名为'Public Sub FillList()'的webpart B中的子节点,我似乎无法锻炼如何做到这一点。 我查了一下webpart的连接,我明白我可以传递很好的属性,但我想调用subs/fire事件。

提前致谢!

回答

1

我知道它有点脏,但我发现它还挺有效的解决方案:

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()”

1

这听起来像是“event bubbling”的情况。

事件冒泡允许某个容器的组成控件将其事件“冒泡”或提出由父(容器)控件处理。在一个网页组件

你的按钮控件可以有下面的代码在它的Click事件:

RaiseBubbleEvent(Me, args) 

其中参数表是一些自定义的类型从System.EventArgs派生。然后这会在父容器上(在你的情况下是UserControl本身)引发(或“冒泡”)事件(用你的自定义参数)。这是在父容器上以下事件中处理:

Protected Overrides Function OnBubbleEvent(ByVal source As Object, ByVal args As System.EventArgs) As Boolean 

这可以在您的网页内重复了容器层次结构(与该页面是最终的容器)。一旦这个事件到达了一个容器,它是你的两个用户控件(A & B)的父类,那么你可以在父容器的代码中调用UserControl B上的公共方法,如果愿意的话可以传递自定义事件。