场景:2个用户控件(foo.ascx和fum.ascx)
foo有一个真正想从fum访问属性的方法。他们住在同一个页面上,但我找不到一种非常简单的方法来完成这种沟通。
有什么想法吗?
答案 0 :(得分:4)
OnMyPropertyValueChanged
。答案 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>