在我的页面上,我有n-userControls(相同的控件)我需要在它们之间进行通信(更具体地说,我需要在值中传递一个)。
我不想让托管页面参与其中。
控件充当“寻呼机”,并通过主机页面订阅的事件与主机页面上的分页数据进行交互。
因此,当用户单击其中一个寻呼机并更改其状态时,另一个控件应该知道它并相应地更改自身。
我不能使用VieState,因为viewstate是每个控件,控制状态也是如此。
我可以使用Session吗? (会话是共享的,我只需要存储一个值)
或许我可以使用更好的东西? (没有QueryString)
答案 0 :(得分:2)
就个人而言,如果不通过控制页面或事件进行此操作,就没有“简单”的方法。
从你所说的我想象的是这样的东西。假设有两个控件A和B是你的寻呼机控件。
包含页面在两个控件上都订阅了“PageSelectionChanged”事件,以响应该事件更新您已有的数据,并通过所有寻呼机控件枚举设置“当前页面”值。
您已经安装了事件管道,用于通过控制进行通信 - >页面,使用您已经构建的内容。
为什么不是会话?
我在评论中被问到这是否会比会话更好,答案是肯定的,原因有很多。
还有其他解决方案,类似于上面发布的解决方案,它会对页面进行递归查看,但你必须小心这一点,以确保你不会进入循环/无限递归的情况,此外如果你在页面上有很多控件,它可能会增加很多开销来不断循环遍历所有内容。
答案 1 :(得分:0)
容器页面在viewstate中有一个存储状态的属性。当用户单击其中一个寻呼机时,它会引发由容器页面处理的事件。然后循环遍历n个用户控件并在这些控件上调用公共方法。
答案 2 :(得分:0)
您可以构建观察者模式的快速修改版本。我建议在页面上构建一个管理器控件。但如果您不想修改页面,这是一个快速解决方案。
您可以创建一个静态方法,该方法将通知所有相同类型的控件。通过调用他们的更新方法。随意传递您需要的数据。
protected void control_event(object sender, EventArgs e)
{
UpdateAllControls(page);
}
public static void UpdateAllControls(Control parent /* can be Page */)
{
foreach (Control c in parent.Controls)
{
if (c.GetType() == this.GetType())
((MyType)).Update()
if (c.HasControls())
controls = GetAllControls(controls, t, c);
}
}