最近看到很多问题都是关于页面动态添加控件,页面postback以后,就取不到这些控件了。其实每次在页面上动态添加控件(或者在数据控件上动态添加列),它们的状态是不会被添加到页面的ViewState中去的,所以每次回送回来,它们就消失了,程序员只能手动把这些控件再次添加到页面上来,才会还原它们的状态。  实在惭愧,上面的说法是错误的,由于自己没有理解该机制,幸亏sp1234大哥及时指出,要不然以后还会犯错误,以后学习切忌浮躁。下面就是他的话:
“他们的状态都在ViewState中,并且asp.net也会尝试恢复状态。只不过,对于文章中的那种情况,“尝试恢复状态”失败,所以无法显示出来那 10个动态装载的控件的样子。但是,如果把这个说成是ViewState中没有他们的状态,是不了解机制的实质的错误推论。状态数据都在,例如 TextBox的Text、MaxLength属性等都保存在ViewState中,但是没有在page_load结束前重建这些状态所依附的控件(根据 UniqueID来唯一决定控件,因此给动态产生的控件设置id属性最重要),所以asp.net没有地方把状态放回控件。

控件从来不会放入ViewState。如果你在页面设计时放置一个控件,那么页面每一次实例化的时候都会重新根据设计代码所编译出的可执行代码,重新创建这个控件。而如果你在页面运行时动态产生一个控件,就要保证下一次页面page_load结束之前自己的代码中重建这个控件(因为page_load之后 asp.net会立刻给这个控件装载状态)。”
        
  MSDN上提供了一种参考的方式,override页面的LoadViewState方法,因为该方法调用是在page_load事件之前,它可以保证这些动态控件在事件处理函数里面是可用的。下面是一个很简单的例子,例子很简单,页面上动态添加10个textbox,在viewstate里面保存一个标志位,表示是否动态添加了这些控件,在LoadViewState函数里进行判断,如果有这个标志,则重新加载这些控件。

public bool IsDynamicLoadControl
    {
        get
        {
            object dynamic = ViewState["IsDynamicLoadControl"];
            return dynamic == null ? false : true;
        }
        set
        {
            ViewState["IsDynamicLoadControl"] = value;
        }
    }
    protected override void LoadViewState(object savedState)
    {
        base.LoadViewState(savedState);

        if (IsDynamicLoadControl)
        {
            LoadTextBox();
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            LoadTextBox();
        }
        
    }
    private void LoadTextBox()
    {
        for (int i = 0; i < 10; i++)
        {
            TextBox input = new TextBox();
            input.ID = "input" + i.ToString();
            this.form1.Controls.Add(input);
        }
        IsDynamicLoadControl = true;
    }

最后可以进行测试一下:

TextBox tb = this.FindControl("input0") as TextBox;
        ClientScript.RegisterStartupScript(
            this.GetType(), 
            "", 
            string.Format("<script>alert('{0}')</script>",tb.Text));

转载于:https://www.cnblogs.com/cuihongyu3503319/archive/2008/09/05/1284936.html

关于页面动态添加控件(转)相关推荐

  1. jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法

    博客分类: jquery-easyui jQueryAjax框架HTML  现象: AJAX返回的html无法做到自动渲染为EasyUI的样式.比如:class="easyui-layout ...

  2. asp.net动态添加控件学习

    看了老师的教程后,自己一点感悟记录下来: 1.在页面提交后,动态生成的控件会丢失, 但如果生成控件的代码在pageload中,就可以,原理是每次生成页面都执行生成. 2.动态按件或页面原来控件, 在页 ...

  3. 动态添加综合布局---动态添加控件及将某XML动态加入到Activity显示(续)

    前言:以前曾写过一篇关于动态生成控件的文章<动态添加控件及将某XML动态加入到Activity显示>,比较浅显,对于RelativeLayout的相关布局设置方法及相对布局与线性布局的混合 ...

  4. 动态添加控件及将某XML动态加入到Activity显示

    一.动态添加控件.设置参数 这个难度比较大,放在前面讲,用的也比较多,普通情况下,我们会提前把布局XML写好,然后对XML中的元素进行设置,但这种方法在有些情况下就显得不适合,比较聊天应用,比如帖子的 ...

  5. Android 在布局容器中动态添加控件

    这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...

  6. Windows phone7 动态添加控件

    Windows phone7 动态添加控件 2011-03-29 3:48 using System; using System; using System.Collections.Generic; ...

  7. 学习笔记:VB.net动态添加控件数组并传递事件

    学习笔记:VB.net动态添加控件数组并传递事件 控件数组和事件 "中间人" 动态添加控件 控件数组和事件 新建一个用户窗体,在定义控件数组时,不能用Withevnets来定义数组 ...

  8. Winform Panel动态添加控件坐标原点问题

    Winform Panel动态添加控件坐标原点问题 Panel的坐标原点是在左上角,是在可视区域的左上角,当滚轮往下移动的时候,坐标原点也会跟着移动,所以动态添加控件的时候,在可视区域的时候控件的距离 ...

  9. 在ASP.NET页面中动态添加控件

    今天被问到如何在ASP.NET 页面中动态创建一批控件,并且希望在后续代码中能访问到这些动态创建的控件.我用下面的例子来解释这个问题 ================================= ...

最新文章

  1. 四川大学java试题_四川大学2013年计算机(软件)学院Java语言程序设计期末考试试题B卷...
  2. linux进程间通讯-共享内存
  3. gorm preload 搜索_macOS系统本地文件搜索工具
  4. windows下揪出java程序占用cpu很高的线程
  5. RabbitMQ 镜像集群队列_集群高可用篇_03
  6. flex弹性布局笔记
  7. creo管道设计教程_Creo产品设计教程:握力器弹簧建模,一个技巧轻松搞定
  8. 红帽--RHCE你需要知道的些事情
  9. 判断这5个数值是否连续相邻
  10. 详解将FTP映射至Windows
  11. python黑帽子第二章实验截图
  12. ligerui父页面向子页面传值
  13. 设置gvim中横竖光标_VIM的配置:高亮光标所在的行列
  14. 润乾报表如何解决F5负载均衡设备下URL限制问题
  15. 《google软件测试之道》精彩语句摘抄
  16. npm 及 webpack打包工具
  17. 装配式施工在建筑装修中的应用研究
  18. 小米投资美的,互联网进入鲨鱼吃鲨鱼阶段
  19. 带你一步步了解S5PV210-I~ARM历史,RISC和CISC的区别,ARM与三星,华为,高通这些的关系
  20. PDF在线预览插件汇总与方案总结

热门文章

  1. 无插件HTML,HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)分享!
  2. java for 循环执行顺序
  3. abb软启动器pstx手册_关于 ABB工业机器人碰撞检测功能的介绍
  4. windowsphone开发_十大混生开发框架
  5. AXI_04 AXI_LITE_MASTER_IP设计与验证
  6. php 初始化漏洞,这样做是不是不会引起PHP全局变量未初始化漏洞
  7. mysql8 2058_SQLyog连接MySQL8.0及以上版本出现2058错误解决方案
  8. python数据接口设计_Python接口与归一化设计
  9. delphi socket 流的使用_Socket
  10. python3.6 安装opencv_MacOS的Python3.6下安装OpenCV3.2.0