加载一个用户控件加载另一个 - ASP.NET WebForms

时间:2010-12-10 01:42:48

标签: asp.net webforms

我有一个必须首先加载的UserControl A,在完成加载后,我需要加载一个UserControl B.

我更喜欢在编译时在页面上添加这两个用户控件(如果可能的话,我希望避免动态加载)。

  • 如果我在编译时在页面上添加用户控件并将用户控件B的可见设置为false,它是否仍然执行后面的B代码?然后,我可以在加载用户控件A
  • 后将可见性设置为true
  • 我是否应该使用事件/代理通知完成加载用户控件A?

4 个答案:

答案 0 :(得分:3)

不要在控件b中的页面事件中加载所有内容,只需在控件b上放置一个方法即可被调用。然后添加一个事件来控制页面消耗的内容,当引发事件时,在控件b上调用load方法。

编辑:SampleCode

好的,例如,创建

  • 一个ASPX页面
  • 2x用户控件

将两个用户控件放入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将控件加载到容器中的顺序。