【发布时间】:2008-10-16 22:36:32
【问题描述】:
场景:2 个用户控件(foo.ascx 和 fum.ascx)
foo 有一个非常想从 fum 访问属性的方法。他们生活在同一页面上,但我找不到一种非常简单的方法来完成这种交流。
有什么想法吗?
【问题讨论】:
场景:2 个用户控件(foo.ascx 和 fum.ascx)
foo 有一个非常想从 fum 访问属性的方法。他们生活在同一页面上,但我找不到一种非常简单的方法来完成这种交流。
有什么想法吗?
【问题讨论】:
OnMyPropertyValueChanged。【讨论】:
有几种方法可以解决这个问题,但最好的解决方案是尽可能解耦。
最解耦的方法是递归的 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);
现在每个控件都可以自省其订阅者集合以找到另一个控件。
【讨论】:
将事件添加到连接到表单的 UserControl。
【讨论】:
最简单的解决方案是让 fum 在 HttpContext.Current.Items[] 中存储一个值,供 foo 稍后读取。
一个更强大的选项是给 foo 一个属性,该页面可以通过对 fum 的引用来填充该属性。
活动需要更多的工作,但在架构上更好。
【讨论】:
您可以通过在Foo's Parent 上使用FindControl 来引用其他用户控件。这是最简单的,您不需要在每个主(父)窗体上编写任何内容。
'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>
【讨论】: