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



本文指出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";
}

这是正确的路吗?

最后,在哪种情况下应该设置动态控制属性

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

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

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

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

最新更新