ASP.NET用户控件交叉通信

时间:2008-10-16 22:36:33

标签: c# asp.net vb.net ascx

场景:2个用户控件(foo.ascx和fum.ascx)

foo有一个真正想从fum访问属性的方法。他们住在同一个页面上,但我找不到一种非常简单的方法来完成这种沟通。

有什么想法吗?

5 个答案:

答案 0 :(得分:4)

  • 在fum.ascx中添加活动OnMyPropertyValueChanged
  • 将相应的EventHandler添加到foo.ascx,它将属性值存储在私有变量中。
  • 将foo.ascx的事件处理程序附加到Page_Load上的fum.ascx事件。
  • 在fum.ascx Page_Load和需要时提升事件
  • 让foo.ascx的方法使用自己的变量

答案 1 :(得分:1)

有几种方法可以解决这个问题,但最理想的是你需要一个尽可能解耦的解决方案。

最分离的方法是递归的findControl方法,该方法遍历控件对象模型,直到找到所需的控件并返回引用。

private Control findControl(Control root, string id) 
{ 
    if (root.ID == id)
    { 
        return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
        Control t = findControl(c, id); 
        if (t != null) 
        { 
            return t; 
        } 
    } 

    return null; 
}

这是另一种有点整洁的方法,虽然我不知道我是否会使用它。(有点伪代码):

public FunkyUserControl : UserControl
{
    private List<UserControl> subscribedControls;

    public List<UserControl> Subscribers
    {
        get { return subscribedControls;}
    }

    public void SubscribeTo(UserControl control)
    {
        subscribedControls.Add(control);
    }
}

从FunkyUserControl继承你的两个用户控件,然后在你的主页面类中继续:

webControl1.SubscribeTo(webControl2);
webControl2.SubscribeTo(webControl1);

现在每个控件都可以内省其订阅者集合以找到另一个控件。

答案 2 :(得分:0)

将事件添加到连接到表单的UserControl。

答案 3 :(得分:0)

最简单的解决方案是让fum在HttpContext.Current.Items []中存储一个值,其中foo可以在以后读取它。

一个更强大的选项是给foo一个属性,页面可以填充对fum的引用。

事件是更多的工作,但在架构上更好。

答案 4 :(得分:0)

您可以使用FindControl上的Foo's Parent来引用其他用户控件。这是最简单的,您不需要在每个主(父)表单上编程任何东西。

'From within foo...call this code<br>
Dim objParent As Object<br>
Dim lngPropID As Long<br>

objParent = Me.Parent.FindControl("fum")<br>
lngPropID= objParent.PropID 'public property PropID on fum<br>