在论坛上,动态控件好象是永久的话题。大家都知道要动态控件起作用,PostBack时需要重新生成或装载(LoadControl),而且需要深入了解其状态的变化过程。
有个同事另谋高就,要离开我们工作的地方了。我给她出了一道出门考题,同时也叫其他手下一起参加。这题目是这样的:
下面两页差别很小,就是一句语句的前后次序有所不同,但PostBack后显示效果有所不同,请解释为什么显示效果不同,并且解释正确显示的那页(你知道是哪页,对么?)中Response.Write的输出结果
TestDyn1.aspx:
<html> <body> <form id="form1" runat="server"> <asp:Button id="btn" runat="server" Text="Click Me" OnClick="Button_Click" /> <br/> 静态: <asp:DropDownList id="ddlStatic" runat="server"> <asp:ListItem Text="1" Value="1" /> <asp:ListItem Text="2" Value="2" /> <asp:ListItem Text="3" Value="3" /> </asp:DropDownList> <br/> 动态: </form> </body> </html> <script language="C#" runat="server"> void Page_Load(Object sender, EventArgs e) { DropDownList ddlDynamic = new DropDownList(); ddlDynamic.ID = "ddlDynamic";
form1.Controls.Add(ddlDynamic);
if (!IsPostBack) { for (int i=1; i <=3; i++) ddlDynamic.Items.Add(new ListItem(i.ToString(), i.ToString())); }
if (IsPostBack) { Response.Write("[Page_Load]静态:" + ddlStatic.SelectedIndex + "<BR>"); Response.Write("[Page_Load]动态:" + ddlDynamic.SelectedIndex + "<BR>"); } }
void Button_Click(Object sender, EventArgs e) { DropDownList ddlDynamic = (DropDownList)form1.FindControl("ddlDynamic"); Response.Write("[Button_Click]静态:" + ddlStatic.SelectedIndex + "<BR>"); Response.Write("[Button_Click]动态:" + ddlDynamic.SelectedIndex + "<BR>"); } </script> |
TestDyn2.aspx:
<html> <body> <form id="form1" runat="server"> <asp:Button id="btn" runat="server" Text="Click Me" OnClick="Button_Click" /> <br/> 静态: <asp:DropDownList id="ddlStatic" runat="server"> <asp:ListItem Text="1" Value="1" /> <asp:ListItem Text="2" Value="2" /> <asp:ListItem Text="3" Value="3" /> </asp:DropDownList> <br/> 动态: </form> </body> </html> <script language="C#" runat="server"> void Page_Load(Object sender, EventArgs e) { DropDownList ddlDynamic = new DropDownList(); ddlDynamic.ID = "ddlDynamic";
if (!IsPostBack) { for (int i=1; i <=3; i++) ddlDynamic.Items.Add(new ListItem(i.ToString(), i.ToString())); }
form1.Controls.Add(ddlDynamic); if (IsPostBack) { Response.Write("[Page_Load]静态:" + ddlStatic.SelectedIndex + "<BR>"); Response.Write("[Page_Load]动态:" + ddlDynamic.SelectedIndex + "<BR>"); } }
void Button_Click(Object sender, EventArgs e) { DropDownList ddlDynamic = (DropDownList)form1.FindControl("ddlDynamic"); Response.Write("[Button_Click]静态:" + ddlStatic.SelectedIndex + "<BR>"); Response.Write("[Button_Click]动态:" + ddlDynamic.SelectedIndex + "<BR>"); } </script> |
了解ViewState与控件生命周期的人,对这题自然不在话下。鉴于Lostinet对此有深入研究,本题禁止他参与,
注:本题是从我在CSDN上回答过的一个问题改编而来的