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

大侠求解:关于动态生成控件及其事件的处理方法
前几天一直在研究这个问题,看了很多资料,比如说这个:http://blog.csdn.net/wonsoft/article/details/4351406
方法确实可行,但是还是有一些问题感到疑惑,作者文章里有这句话:添加控件和给控件加事件时绝对不能放到 if(!IsPostback){}里面,那样的话,点击一次后控件会消失,而且事件也不会执行。 我试验了一下果然如此。究其原因,个人认为是因为触发事件后回发至客户端引起页面重新加载,于是(!ispostback)中的控件生成没有执行到,所以控件集体“消失”了。

但是问题来了,(这次控件生成的代码没有放在ispostback中),我跟踪了一下代码的执行,发现,首次加载的时候把生成控件的方法执行了一遍,但是,触发控件事件回传的时候,又再次把代码执行了一遍!!!想象一下,如果是静态的控件,我们可以直接写事件的触发方法,事件触发,直接跳到方法里执行。可是这里居然连带着把生成控件的代码执行的一遍!!!难道是因为 重新生成一下控件,以方便捕捉到相应的控件的事件触发方法???这在原理上是可以解释的,毕竟控件都是一样的。于是,我模拟了一下:

问题描述:我在一个网站里做了一个首页加载的时候,可以随机从数据库中选取100张图片的给游客观看的功能,原理是先把数据库里所有图片的id(大于100个)值存进一个一维数组里,再设定随机数生成的范围就是这个数组中的id值,于是就可以生成一百张图片(过滤重复图片的方法不提),问题来了,存放这100张图片的控件我也是动态生成的,我还特意为每个照片加了一个linkbutton按钮来测试回传,结果确实也是把生成代码再次执行了一番,但是问题是生成的图片ID是随机的,两次的随机数是不可能一样的,也就是说第二次执行控件生成的时候图片的Id应该已经改变!但为什么还能找到对应的事件触发方法?!求大神解释!
------解决方案--------------------
建议用ajax,不要刷新,否则viewstate和id肯定会变的。
------解决方案--------------------
俺们无法回答你的问题,原因是某人反对俺们说页面生存期
http://bbs.csdn.net/topics/390317274

ps:抛开页面生存期的问题,我们来看你的代码的一般写法

button but=new button

but.id=你说的随机数
but.click+=事件处理
你看红字的事件挂接代码,他和id有关系吗?木有任何关系。
------解决方案--------------------
如果你设置了动态控件的ID,那么asp.net就会去查找ID,因此就算重建控件时你把插入位置(控件树上的Index改变了)也一样可以让asp.net回填各种状态以及准备好事件。但是如果找不到相同的ID,asp.net就会按照控件树上的Index(位置)来处理,假设次位置上的控件没有预设的ID值那么asp.net就默认地认为它就是对之前的控件的重建。
------解决方案--------------------
在重建过程中,通常你不需要为控件填入状态值,asp.net会自动从ViewState中将各个控件的状态值回填给它。因此如果你此时甚至去查询数据库来绑定控件,这也是多此一举的,会让你的程序反而更慢。

可以做个实验,你可以在Button按钮事件中动态地创建一个GridView,并且查询数据库并绑定给它创建表格界面,然后客户端就可以点击“编辑、删除”等等功能,此时你只要在page_load中创建相同ID的GridView就行了(GridView不管有几行几列、转变为什么状态都会自动重现),完全不需要再去读取数据库来绑定GridView。