leafyoung v.s. dotnet
在ASP.NET中动态创建一个控件总是不那么顺利,特别是当对页面的Life Cycle不是那么了然的情况下!这里简单描述一下要求,然后提供一个解决方案,大家看看有没有更好的Idea,如果有的话就是我的大幸了,呵呵!要求:页面上有一个Add按钮,每点击一次该按钮,页面上动态创建一个WebPartZone!提醒:WebPartZone只能在OnInit或之前才能创建,否则报异常!大家都知道,按钮的点击事件是在RaisePostbackEvent时触发的,这意味着点击事件在OnLoad阶段之后才执行,远远落后于OnInit阶段,而且ViewState在OnLoad时才准备好,OnInit以及之前的阶段根本就不能使用ViewState!如果试图在按钮点击事件里面创建WebPartZone等控件,唯一的后果就是页面出错;而如果在OnInit里面创建控件,由于ViewState没有准备好,那么有些数据比如当前需要创建的个数(存在ViewState里面)就无法获得!目前对这个问题我还没有找到什么好的解决方案,经过实验,勉强得出一个不怎么优雅的方案,就是利用HiddenField保存数据,然后直接使用Request.Form["XXX"]在OnInit阶段取得数据;而判断是否点击按钮也是通过Request.Form是否存在对应数据来判断的!废话不多说了,大家看看代码吧!
posted on 2007-04-04 11:27 游民一族 阅读(3565) 评论(10) 编辑 收藏 网摘
关注,我也常碰到这个问题 回复 引用 查看
园子里这个问题的原理已经说的很好了,你是用QueryString来存放状态的,可以试试用ViewState存放是否创建了控件。 回复 引用 查看
@[David.S] ???你看文章了么?是我写的不够清楚还是你理解得有问题呢?!郁闷 还有,我从来就不关心原理的,我是极端实用主义者,哈哈◎_@ 回复 引用 查看
mark,有时间再研究 回复 引用 查看
关注,没有好的办法暂时 回复 引用 查看
我也遇到过同样的问题,但是没有想到用这样的方法去解决!谢谢!受教了! 回复 引用
如果控件是动态加在容器控件(Panel、PlaceHolder)里的话,好象是可以的,所以你上面的这样写 protected void btnAdd_Click(object sender, EventArgs e) { TextBox newTextbox = new TextBox(); newTextbox.ID = "txt"; this.PlaceHolder1.Controls.Add(newTextbox); } 是可以的。 回复 引用 查看
@清晨风 拜托看清楚再发言:"提醒:WebPartZone只能在OnInit或之前才能创建,否则报异常!" 回复 引用 查看
用處很大,也遇到同樣的問題.感謝!! 回复 引用
可以尝试使用PageStatePersister的派生类,比如HiddenFieldPageStatePersister类,它的构造函数接受一个Page类型的参数,可以把你的页面传进去。然后调用其Load方法。这样从它的ViewState属性里可以得到一个Pair类型的对象。然后使用Page类的LoadViewState方法把这个Pair对象的相应属性传进去。经过试验,我发现可以使用((Pair)pairObject.Second).First获得Page.LoadViewState方法能够接受的ArryList类型的数据。 示意性的代码类似下面这样。 HiddenFieldPageStatePersister psp = new HiddenFieldPageStatePersister(this.Page); psp.Load(); if (psp.ViewState != null) { Pair pairObject = (Pair)((Pair)psp.ViewState).Second; this.LoadViewState(pairObject .First); } 我试过了能行,执行完这些代码后ViewState里就有东西了。本质上这种方法是手动在Init之前加载一遍ViewState的方法。但因为没有做进一步研究,还不清楚是否会带来什么副作用。是否使用楼主自己斟酌,这里只提供一个参考。 另外,如何知道相应按钮被点击的逻辑似乎没有什么其它办法。最直接的方式就是从Request里面取,我觉得即直接又简单。不过有一点值得说明的就是最好使用相应按钮的UniqueID来查询Request.Form对象(类似Request.Form[someButton.UniqueID]),这样即使你的代码放在很深的控件嵌套层次中也照样可以工作。 回复 引用
昵称: [登录] [注册]
主页:
邮箱:(仅博主可见)
验证码: 看不清,换一个
评论内容:
登录 注册
[使用Ctrl+Enter键快速提交评论]
Powered by: 博客园 Copyright © 游民一族