我有一个必须首先加载的UserControl A,在完成加载后,我需要加载一个UserControl B.
我更喜欢在编译时在页面上添加这两个用户控件(如果可能的话,我希望避免动态加载)。
答案 0 :(得分:3)
不要在控件b中的页面事件中加载所有内容,只需在控件b上放置一个方法即可被调用。然后添加一个事件来控制页面消耗的内容,当引发事件时,在控件b上调用load方法。
编辑:SampleCode
好的,例如,创建
将两个用户控件放入aspx页面。
<cc:control1 runat="server" id="control_one" />
<cc:control2 runat="server" id="control_two" />
然后在控制1 中,创建一个委托和事件。
public delegate void MyCustomEvent (EventArgs args);
public event MyCustomEvent MyEvent;
protected void Page_Load(object sender, EventArgs e)
{
MyEvent(e);
}
所以我在页面加载时引发了事件。因此,当你完成后,你将需要你的逻辑来调用MyEvent事件。
在页面中,您要为该事件添加处理程序,以便在调用它时可以对其执行某些操作。
protected override void OnInit(EventArgs e)
{
control_one.MyEvent += new WebUserControl1.MyCustomEvent(control_one_MyEvent);
base.OnInit(e);
}
void control_one_MyEvent(EventArgs args)
{
control_two.MyCustomLoad();
}
因此,当页面初始化时,我添加了事件处理程序。在事件处理程序中,我在第二个控件上调用自定义方法来加载东西。
然后在第二个控件中我有:
public void MyCustomLoad()
{
//Stuff only loaded when event is raised and calls this method.
}
所以这允许控件1加载一些东西,比如它已经完成,当页面知道它完成时,它可以告诉控件2做某事。
编辑:与朋友讨论后,我会通过控制订单来解释我的意思。
您无法控制页面生命周期事件的顺序。即:你不能拥有Control A,遍历它所有的页面生命周期事件,然后一旦完成,让Control B运行它的所有页面生命周期事件。
如果你不使用页面生命周期,你可以做一个学位,如上面的例子所示,创建一种控制渲染控件顺序的方法。通过在控制A完成时在某些点引发事件,您可以告诉控制B执行某些操作。
两个控件之间的中间部分是处理Control A引发的事件的页面,它调用控件B上的方法。你(你可以破解它)不能具体make Control A告诉Control B做某事,因为这会在两个控件之间产生直接的依赖关系。
答案 1 :(得分:1)
这是一个致命的设计缺陷。您应该设计UI,以便控件加载的顺序无关紧要。控件加载的顺序超出了您的控制范围。
解决订单/订单行控制对的“Phill”问题:
我认为Order控件的开发是因为它本身很有用。我假设OrderLines的开发是为了能够显示Order控件显示的给定订单的行项目。
我认为应该有一个组合Order和OrderLines的单一复合控件。此控件将传递给OrderLines控件,这是一个由要显示的行项组成的DataSource。这使得OrderLines独立于任何其他控件 - 它只显示它被告知要显示的数据。它不知道数据来自何处。
请注意,这可以扩展到典型的网格/细节/细节线方案,您可以在其中传递一组订单;选中时,特定网格行将通过Order控件选择的顺序;当它显示订单项的时间时,将当前订单的订单项集合传递给OrderLines控件等。
这使得每个控件都无需执行任何操作,只需要负责的单个作业。
答案 2 :(得分:1)
但是如果你的控件彼此之间有特定的依赖关系,那么它们应该只是一个控件吗?
答案 3 :(得分:0)
“我有一个必须首先加载的UserControl A,在完成加载后,我需要加载UserControl B.
我更喜欢在编译时在页面上添加这两个用户控件(如果可能的话,我希望避免动态加载)。 “
我建议使用WebFormsMVP: -
http://webformsmvp.com/ http://wiki.webformsmvp.com/index.php?title=Main_Page
除了作为Model-View-Presenter的良好实现之外,该框架最有用的功能之一是它对Messaging的支持。
简而言之,您创建了消息类型,并且您的用户控件(视图)可以将消息总线所需的任何类型的消息发布。其他控件可以订阅特定类型的消息,WebFormsMVP框架将确保它们被传递。
这允许您通过消息发布和处理来处理用户控件之间的交互。订阅,不必担心他们加载了哪个订单。
您唯一的另一个选择是使用动态控件加载,因为正如其他人所指出的那样,您不能依赖ASP.NET将控件加载到容器中的顺序。