日期:2014-05-17  浏览次数:20453 次

关于动态生成网页控件的疑惑
最近在设计一个可以动态生成网页的小程序,程序很简单,前台的页面如下:
只有一个按钮和一个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 = "测试" + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你好大的单子";
            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