0

我有一个用户控件,它使用标准if(!IsPostBack){//initialize myself}范例来避免在回发期间重新进行初始化(因此,为了增加 ViewState 的使用,交易更少的 DB 命中)。这种方法在大多数情况下都很适合我,但有一个地方我想在回发期间将此控件添加到控件层次结构“后期”。

当然,这会导致初始化逻辑失败,并使控件呈现为未初始化状态。

我应该使用什么保护来确定我是否应该初始化,因为!IsPostBack不是切割它?我可以在 期间设置一个标志LoadViewState,但这似乎有点骇人听闻。我想找到一些仅在控件首次添加到控件层次结构时才会发生的条件,并以此为关键。存在这样的条件吗?

[编辑] 包含页面的示例伪代码如下:

protected void Page_Prerender(object sender, EventArgs e)
{
    Controls.Add(LoadControl("some_control.ascx"));
}

有没有办法some_control知道它被添加晚了?

4

4 回答 4

0

你不能使用构造函数来初始化你的子控件吗?(或者创建一个Initialize方法)然后你控制控件什么时候初始化。

于 2009-09-14T18:09:43.427 回答
0

也许这会帮助您理解您的问题:“……如果在事件处理程序中创建一个控件并动态添加到控件树中会怎样?在这种情况下,控件将进行追赶。一旦它被添加到控制树中,它就会开始执行它的阶段,直到它到达页面的当前阶段……”</p>

更多信息在这里:

http://weblogs.asp.net/vga/archive/2003/08/11/23498.aspx

于 2009-09-14T18:13:44.227 回答
0

实际上并没有“第一次”添加控件的概念,因为请记住,每次请求页面时,都会创建一个的页面对象,其中包含所有新的控件实例。以前创建的控件实例不会添加到您的新页面对象中。

为什么初始化逻辑失败?也许如果您发布该代码,我们可以提出一些建议 - 似乎不一定必须如此。

于 2009-09-14T18:15:14.907 回答
0

进一步的搜索并没有让我找到这个问题的一般解决方案。我最终做的是设置一个标志Page_LoadViewState来抑制控件的初始化 - 实际上与用 保护初始化相同!IsPostBack,但更精确一些。

于 2009-09-15T22:42:13.277 回答