动态控件的状态问题

在论坛上,动态控件好象是永久的话题。大家都知道要动态控件起作用,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>

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   ddlDynamic.Items.Add(new ListItem(i.ToString(), i.ToString()));
   }

  
 
   if (IsPostBack)
   {
    Response.Write(“[Page_Load]静态:” + ddlStatic.SelectedIndex + “
“);
 Response.Write(“[Page_Load]动态:” + ddlDynamic.SelectedIndex + “
“);
   }
}

void Button_Click(Object sender, EventArgs e)
{
 DropDownList ddlDynamic = (DropDownList)form1.FindControl(“ddlDynamic”);
      Response.Write(“[Button_Click]静态:” + ddlStatic.SelectedIndex + “
“);
 Response.Write(“[Button_Click]动态:” + ddlDynamic.SelectedIndex + “
“);
}

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>

void Page_Load(Object sender, EventArgs e)
{
   DropDownList ddlDynamic = new DropDownList();
   ddlDynamic.ID = “ddlDynamic”;

   if (!IsPostBack)
   {
 for (int i=1; i   ddlDynamic.Items.Add(new ListItem(i.ToString(), i.ToString()));
   }

   form1.Controls.Add(ddlDynamic);

 
   if (IsPostBack)
   {
    Response.Write(“[Page_Load]静态:” + ddlStatic.SelectedIndex + “
“);
 Response.Write(“[Page_Load]动态:” + ddlDynamic.SelectedIndex + “
“);
   }
}

void Button_Click(Object sender, EventArgs e)
{
 DropDownList ddlDynamic = (DropDownList)form1.FindControl(“ddlDynamic”);
      Response.Write(“[Button_Click]静态:” + ddlStatic.SelectedIndex + “
“);
 Response.Write(“[Button_Click]动态:” + ddlDynamic.SelectedIndex + “
“);
}

 

了解ViewState与控件生命周期的人,对这题自然不在话下。鉴于Lostinet对此有深入研究,本题禁止他参与,

注:本题是从我在CSDN上回答过的一个问题改编而来的