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

时间:2012-02-23 19:23:05

标签: c# asp.net webforms page-lifecycle

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 个答案:

答案 0 :(得分:1)

对于最后一个问题没有单一答案,因为根据属性的性质,在特定方法中设置值可能有意义也可能没有意义。

  

如果请求是回发,则控件的值尚未显示   从视野状态恢复。如果在此处设置控件属性   阶段,它的价值可能会在下一次事件中被覆盖。

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

我的建议是做一些试验和错误,看看哪些有效,因为我记得使用动态控件,在某些情况下可能会很难管理。