您的位置:首页 > 其它

GridView 后台排列 Column 、 用户自定义GridView 显示、GridView的PreRender ,Init,Load 方法

2008-12-25 09:18 477 查看
项目到了末期,用户竟然来了个小变态,说要自定义所有GridView显示的列,也就是说用户可以去控制GridView显示的列数,列的排序,OK ,我的Boss 把这个光荣的任务交给我了,我很荣幸。

由于项目的保密原因,很细节的东西我就不写了,我写些技术上的东西给大家分享。

首先,设计了两张表,1对多的关系,一个表记录的是用户自定义的哪个GridView,一个表记录的是这个GridView都自定义了哪些列。

主要是GridView 的 Column 排序问题,我们目前的状况是 大概有50 - 60个GridView 用户需要自定义,而且,先前的GridView 都已经绑定好了。大概考虑了一天,我选择后台自动生成Column 列,前台的 <asp:boundFiled> 这些列都注释掉。

自动生成的话简单了,new 一个 BoundField 然后 设置他的属性,然后添加到 GridView的Columns里面。

第一个用例做好以后,发现一个问题,模板列如何自动生成??。模板列里有的是button 有的是Label 有的是 <a href>标签。我后台没办法知道,而且这个随意性很大,不好控制(除非把模板列想办法存到数据库里),X 我疯了这样做。

于是想办法先按照原样绑定,绑定后,在根据用户设置去摆弄GridView的列,因为绑定好的GridView模板列已经绑定好了,只需要做做其他改动就ok了,我便写了个方法在GridView PreRender,写完之后发现可行,但是问题是翻页之后,原先绑定的模板列没有数据了,而且他的普通绑定还有数据(我的翻页用的是GridView自带的)。

我跟踪调试发现,单击翻页的时候,这个时候GridView 里面的模板列的值都是Null ,其他的没有变,也就是说,单击翻页的时候,我断点里面的GridView的Columns[0]这里面是null(所有的模板列), 而且他的普通绑定都ok。

我想了想。其实http是无状态的,asp.net 的有状态做法是因为他把控件的属性应藏到了javascript里面和<input hidden>标签里面,这样就说明,在第一次数据按前台绑定后,这段javascript和<input hidden>已经生成好了,我又重新摆弄了一下列的位置,这种状态当然在第二次回传的时候也就对应不了了,所以,这个地方都是null了。

PreRender是在GridView展示之前调用的事件,我在这里摆弄,明显数据已经绑定好了后发生的事情。

Load 就是在数据加载的时候调用的,试过了,也不行

Init 这个就好了,因为他是在前台页面构建GridView时调用的,先把我的Column重新排序,然后生成javascript和<input hidden> 然后在绑定列 ok!。就是这么简单!哈哈

但是要注意,页面每次回传都会调用这个Init方法,所以要谨慎一点,例如你单击按钮什么的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: