代码之家  ›  专栏  ›  技术社区  ›  Rob West

如何在回发时更改复合服务器控件中的子控件

  •  3
  • Rob West  · 技术社区  · 15 年前

    我有一个ASP.NET web窗体复合控件,我们称它为控件A,它包含一个子复合控件,我将调用控件B。控件B的子控件依赖于控件A的属性。

    在初始加载时,我在控件a的on load中设置这个参数,并且控件b在createchildcontrols中正确设置其子控件时,一切都正常。

    但是,当我想通过控件A下拉列表中的selectedIndexChanged更改此参数时,事件处理程序在生命周期中的处理似乎太晚,控件B无法获取更改的值。可能这是因为已经调用了控件B的CreateChildControls方法。

    如何让控件B更新其子控件,以便它们可以在正常生命周期中运行,并在必要时加载viewstate?

    为了清楚起见,当改变控件a的参数时,控件b的子控件可能需要保留一些,需要删除一些,需要添加一些,因此对于保留的控件,它们仍然需要加载状态。

    1 回复  |  直到 15 年前
        1
  •  4
  •   slugster Joey Cai    15 年前

    SelectedIndexChanged事件将在页面和控件A的页面加载(onload)之后处理。您正确地认为,在您到达此事件处理程序时,您的页面已经重新生成,并且ViewState已恢复到控件-应该是,在未重新生成页面/控件时处理事件的意义是什么是吗?

    我建议的三个简单解决方案是:

    • 不要让控件B检查其父级的值,然后相应地构建自己,这有点反模式。相反,让控件A根据下拉列表的值加载控件B的正确版本。让控件A负责加载的内容,而不是控件B。控件B应该是哑的,不关心其父控件是什么。如果需要与其父接口,则应通过接口进行。

    • 如果只是隐藏和显示字段,那么只需将它们全部放在控件B中,并隐藏不应显示的字段如果您将大多数控件的visible属性设置为false,则它们不会向输出流呈现任何HTML,因此当页面被发送回客户端时,对客户端的影响最小

    • 根据所选值控制自身的重建部分。它可以包含一个div,您可以执行div.controls.clear(),然后将右控件添加回其中。在选择索引更改事件中,这将是很好的,因为您不关心哪些控件已经存在,它们的值是什么(如果您关心现有的一些控件,那么从控件集合中清除那些控件并在它们周围添加新控件是相对微不足道的)。

    这三种方法各有利弊,你最终可能做的是这三种方法的混合还有另一种可能的方法,您可以使用pageparser及其getcompiledpageinstance方法来获取用于重新生成页面的ihttphandler,但这是一种高级方法,可以在这里用一个小的回复来覆盖它。