2009-12-06 24 views
3

复合服务器控件我有一个ASP.NET web窗体复合控件,让我们把它控制A,其中包含一个子复合控件,我称之为控制B.儿童控制B的控件取决于控件A的属性。如何更改子控件在回发

在初始加载时,我在控件A的OnLoad中设置此参数,并且一切正常,控件B在CreateChildControls中正确设置其子控件。

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

我怎样才能得到控制B到更新其子控件以这样的方式,他们可以再通过他们正常的生命周期内,根据需要加载视图状态?

只是为了清楚起见,当控件A的参数发生变化时,控件B的子控件可能需要保留一些控件,有些需要删除,有些需要添加,因此对于剩下的控件他们仍然需要加载状态。

回答

4

SelectedIndexChanged事件将在页面和控件A的Page_Load(OnLoad)之后处理。你认为你的页面已经被重建并且viewstate在你到达这个事件处理器时恢复到控件的状态 - 因为它应该是,当页面/控件还没有被重建时处理事件的要点是什么?

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

  • 没有控制B查看其父的值,然后建立自身相应的,这是一个有点反模式。相反,让控件A根据下拉的值加载控件B的正确版本。 IOW使控制A负责装载什么,而不是控制B.控制B应该是愚蠢的,而不在乎它的父母是什么。如果需要连接到它的父级,它应该通过一个接口来完成。

  • 如果你只是隐藏和显示字段,那么只需让他们全部在控制B中,并隐藏那些不应该显示的。大多数控件将不会呈现任何HTML输出流,如果你设置其可见属性设置为false,所以当网页被发送回客户端

  • 有控制重建自身部分在客户端的影响最小取决于所选的值。它可以包含一个DIV,你做一个div.Controls.Clear(),然后将正确的控件重新添加到它。这将是罚款SelectedIndexChanged事件做,因为你不关心控件是什么已经存在,它们的值是什么(如果你做的一些现有控件的护理,那么它是比较琐碎不清除这些从控制采集和添加新的控件周围)

这三种方法都有它的优点和缺点,你可能最终做的是三者的混合物。还有另一种可能的方法,即利用PageParser及其GetCompiledPageInstance方法来获取用于重新生成页面的IHttpHandler,但这是一种高级方式,可在此处用一个小小的回复来覆盖。

+0

关于您的第一个建议:由于值的更改发生在事件处理程序中,因此在调用CreateChildControls之后,控件b已经使用旧设置创建。你如何看待这个工作? – 2009-12-07 09:09:28

相关问题