2012-02-23 97 views
2

This文章指出,Page_PreInit应该用来在哪个事件中应该设置动态控制属性?

创建或重新创建动态控件。

例如:

Button button = new Button(); 
somePanel.Controls.Add(button); 

好。我明白。

然而,它也表示:

如果请求是回发,所述控件的值尚未 是来自于视图状态恢复。如果您在此 阶段设置控件属性,则其值可能会在下一个事件中被覆盖。

咦?

这是否意味着我应该做的就是创建按钮,但不设置按钮的任何成员?

例如:

Button button = new Button() { CommandArgument="arg" }; 
somePanel.Controls.Add(button); 

这是否意味着,在这个事件中设置CommandArgument是不正确/不推荐/可能会导致错误/意外的行为?

假设是不正确,这将导致我认为一个人会做这样的事情:

protected void Page_PreInit(object sender.....) 
{ 
    somePanel.Controls.Add((new Button()); 
} 

protected void Page_Init(object sender.....) 
{ 
    foreach(Button button in somePanel.Controls) 
     button.CommandArgument = "arg"; 
} 

这是正确的方式?

最后,在哪个事件中应该设置动态控制属性?

+1

做什么文章说..有它在init中,然后有一些如果IsPostBack代码..你可以做预渲染或PreInit以及我的意见 – MethodMan 2012-02-23 19:25:56

+0

@DJKRAZE - 我很困惑什么文章状态,因此问题:)。 – 2012-02-23 19:29:57

回答

1

对于最后一个问题,没有单一的答案取决于属性的性质,它可能或可能没有意义在特定方法中设置值。

如果请求是回发,则控件的值尚未从视图状态恢复为 。如果您在此 阶段设置控件属性,则其值可能会在下一个事件中被覆盖。

可能是这里的关键词。如果考虑一些可能会随着表单经历各种状态而发生变化的属性,那么这里就必须注意可能被覆盖的内容,以及这是否是坏事的问题,因为它可能是更新后的价值应该是持久的,而在其他情况下,原始价值可能会更好,例如,如果有人想将表单重置为初始状态。

我的建议是做一些试验和错误,看看有什么作用,因为我记得使用动态控制,这在某些情况下可能会非常棘手,无法正常管理。