关于动态生成网页控件的疑惑
最近在设计一个可以动态生成网页的小程序,程序很简单,前台的页面如下:
只有一个按钮和一个panel
- HTML code
<div style="height:100px; background-color: #C0C0C0;"> 测 试 </div> <asp:Panel ID="Panel1" runat="server" Height="443px" > </asp:Panel> <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" style="height: 21px" />
后台的代码如下:
- C# code
private void addC() { Label labelFirstRear = new Label(); labelFirstRear.ID = "labelFirstRear"; labelFirstRear.Text = "测试" + " 你好大的单子"; labelFirstRear.Attributes.Add("style", "font-weight:bloder;font-size:18px;color:#ffffff;"); HtmlGenericControl brFirstRear = new HtmlGenericControl(); brFirstRear.TagName = "br"; HtmlGenericControl divFirstRear = new HtmlGenericControl(); divFirstRear.TagName = "div"; divFirstRear.ID = "我的div" ; divFirstRear.Attributes.Add("style", " background-color: red;"); divFirstRear.Controls.Add(labelFirstRear); divFirstRear.Controls.Add(divFirstRear); divFirstRear.Controls.Add(brFirstRear); labelFirstRear.Text = "这段内容已经结束"; divFirstRear.Controls.Add(labelFirstRear); divFirstRear.Controls.Add(brFirstRear); Panel1.Controls.Add(divFirstRear); }我的问题是,现在这个程序能够基本上满足我的要求,但是还有几个小问题,
1,点击按钮后,程序根据我的要求可以进行显示,但是,不管我在divFirstRear这个里面增加多少个divFirstRear
查看代码的时候,仅仅只有两个br 的换行符。
2、像这样的结构,如果我想遍历里面的所有控件(如textbox)?肯定不能直接的用 foreach in panel会报错
[解决办法]
当页面执行完Render过程,也就销毁了,你所谓“动态增加”的控件也就跟着销毁了。下一次回发,并没有那些。
对于普通的asp.net页面而言(包括你在设计页面上声明的),它在页面的page_load事件过程结束之前,都是重建了的,也就是在控件树的同一结构的地方,具有与上一次Render输出html时相同的ID或者相同的次序的控件,这样asp.net才能为其填入ViewState值,并且随后触发其事件。
以前写过的一个demo。共有两个文件:
第一个:XXX.ascx
- HTML code
<%@ Control Language="C#" ClassName="XXX" %><%@ Import Namespace="System.Drawing" %><%@ Implements Interface="IXXX" %><script runat="server"> public override void DataBind() { base.DataBind(); DropDownList1.DataBind(); } public string Name { get { var nm = ViewState["name"]; return (string)nm ?? "无名氏"; } set { if (Name != value) { ViewState["name"] = value; EnsureChildControls(); pName.DataBind(); } } } public event Action NameChanged; public string MarkedValue { get { EnsureChildControls(); return this.DropDownList1.SelectedValue; } } protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { switch (this.DropDownList1.SelectedValue) { case "标记:红": this.div.ForeColor = Color.Red; break; case "标记:蓝": this.div.ForeColor = Color.Blue; break; case "标记:黑": this.div.ForeColor = Color.Black; break; } } protected void LinkButton1_Click(object sender, EventArgs e) { Name = pName.Text; if (NameChanged != null) NameChanged(); } private List<string> GetDropdownList1Datas() { return new List<string> { "标记:黑", "标记:红", "标记:蓝" }; }</script><asp:TextBox runat="server" ID="pName" Text="<%# Name %>"></asp:TextBox>先生(女士): <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">修改名字</asp:LinkButton><asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" DataSource="<%# GetDropdownList1Datas() %>" /><br /><asp:Panel runat="server" ID="div"> 你的合同付款期限已到,未付款<asp:TextBox runat="server" ID="pMoney" Width="60px" />元人民币,请及时付款。 <br /> <br /> XXX年XXX月XXX日</asp:Panel>