一个困扰两天的创建动态控件的问题

本文介绍如何在 ASP.NET 中动态创建 Label 控件,并解决因页面 Postback 导致控件丢失的问题。通过在每次页面加载时重新创建控件,确保数据正确绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本以为可以用下面的方法动态创建对象,并且提取控件的值:

 //增加序列号显示
    protected void addPSlabel(int begini,int endi, string panels)
    {
        Panel pl;
        int j = 0;
        pl = (Panel)this.FindControl(panels);
        //pl.Controls.Clear();
        pl.Controls.Add(new LiteralControl("<table width=100%><tr>"));
        for (int i = begini; i <= endi; i++)
        {
            Label lb = new Label();
            lb.ID = "LabelPS" + i.ToString();

            if (j != 0 && j % 3 == 0)
            {
                pl.Controls.Add(new LiteralControl("</tr><tr>"));

            }
            pl.Controls.Add(new LiteralControl("<td>"));
            pl.Controls.Add(lb);
            pl.Controls.Add(new LiteralControl("</td>"));
            if (j != 0 && j % 5 == 0)
            {
                pl.Controls.Add(new LiteralControl("</tr><tr>"));
                j = -1;
            }
            j = j + 1;
        }
        pl.Controls.Add(new LiteralControl("</tr></table>"));
    }

这个是增加的方法

然后在数据绑定时创建并赋值,浏览时可以看到没有问题 能够看到值了

但是问题出现了 要再次点击时提交页面时 用下面的方法 提取控件的值 老是出现对象没有初始化

  string lbName;
            Label lb;
            Panel pl = (Panel)this.FindControl("Panel1");
            DataRow row = dt.NewRow();
            for (int i = 0; i <= icount - 1; i++)
            {
                ij = i + 1;
                lbName="LabelPS"+ij.ToString();
                lb = (Label)pl.FindControl(lbName);
                row[i] = lb.Text.Trim();
            }

后来查看网页的源文件,也有那个ID的控件啊 。。。思考了很久,难道是PR值太低

经过详细的思考 后来才发现 原来是 页面提交后 page load了一次 那些动态创建的控件是不能使用了的 所以要在页面重新加载时再次创建一次

 try
        {
            int sumcount =int.Parse(Session["conCount"].ToString());
            if (sumcount > 0)
            {
                addPSlabel(1, sumcount, "Panel1");
            }
        }
        catch (Exception)
        { }

以上是本人的一次一次小总结 希望能给朋友抛砖引玉之功效!少走弯路。。。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值