惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
Webroot Blog
Webroot Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Threat Research - Cisco Blogs
V2EX - 技术
V2EX - 技术
L
LINUX DO - 热门话题
Google DeepMind News
Google DeepMind News
Recorded Future
Recorded Future
S
Schneier on Security
I
InfoQ
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The GitHub Blog
The GitHub Blog
S
Security @ Cisco Blogs
O
OpenAI News
W
WeLiveSecurity
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
人人都是产品经理
人人都是产品经理
Cloudbric
Cloudbric
The Last Watchdog
The Last Watchdog
The Hacker News
The Hacker News
Google Online Security Blog
Google Online Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
GbyAI
GbyAI
NISL@THU
NISL@THU
T
Tailwind CSS Blog
V
Visual Studio Blog
PCI Perspectives
PCI Perspectives
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
D
DataBreaches.Net
B
Blog RSS Feed
N
News and Events Feed by Topic
N
News and Events Feed by Topic
H
Heimdal Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
腾讯CDC
Latest news
Latest news
V
Vulnerabilities – Threatpost
Hacker News: Ask HN
Hacker News: Ask HN
WordPress大学
WordPress大学
V
V2EX
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Register - Security
The Register - Security
Help Net Security
Help Net Security

博客园 - 右手边

C#动态执行代码 这是一个广为流传的关于项目管理的通俗讲解 [史上最狂妄的演讲]你不服都不行<英汉版>~~ - 右手边 - 博客园 利用反射动态创建对象 使用反射技术动态创建类对象(实例代码) 利用反射来动态创建实例和调用方法(上) 基于ASP.NET的Web动态控件创建 家中请客(最佳ERP教材)- - 2007年4月25日 经典的几句英文 网上英语免费杂志在钱订阅网址 将(Oracle)数据库表导出到Excel,并生成文件(C#实现) B/S结构与C/S结构 AJAX三步走 Ajax简单例子 Oracle 启动与关闭例程 AJAX的原理 VB资料库-无限下载 ASP.Net中程序构架与程序代码的分离 Oracle 系统结构
关于页面动态添加控件
右手边 · 2007-05-25 · via 博客园 - 右手边

  最近看到很多问题都是关于页面动态添加控件,页面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));