一直以来,除非是纯后台数据用gridview,不然用的都是repeater,因为它生成的代码最少,基本上是纯html,可以完全自定义,很适合搞个性化开发,事实上,它就扮演了一个迭代器的角色,今天无聊翻看工具箱的时候发现了一个datapager,引起了兴趣,google之,发现其是与listview一起出现的,好像还挺不错的,第一个测试代码如下:
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
2 < LayoutTemplate >
3 < table >
4 < tr id = " laydiv " runat = " server " ></ tr >
5 </ table >
6 </ LayoutTemplate >
7 < GroupTemplate >
8 < tr runat = " server " >
9 < td id = " layoutTemplate " runat = " server " />
10 </ tr >
11 </ GroupTemplate >
12 < ItemTemplate >
13 < td ><% # Eval( " id " ) %> , <% # Eval( " username " ) %> , <% # Eval( " password " ) %> , <% # Eval( " email " ) %>< br /></ td >
14 </ ItemTemplate >
15 </ asp:ListView >
16 < asp:DataPager ID = " dpager " runat = " server " PagedControlID = " lvtest " PageSize = " 8 " >
17 < Fields >
18 < asp:NumericPagerField NextPageText = " ... " PreviousPageText = " ... " />
19 < asp:NextPreviousPagerField FirstPageText = " 第一页 " />
20 </ Fields >
21 </ asp:DataPager >
原理是,先设一个布局容器,布局容器里面有一个runat="server"的html容器,比如div,ul,span,tr等,这个容器就到listview标签里设为ItemPlaceholder,这样服务器就知道对应ItemPlaceholderID把模板里的内容填到那里面,最简单的用法就是这样,
我上面的稍微复杂了一点,把group加上了,其实就多包了一层,布局容器包一个分组容器,分组容器包模板html容器,然后把listview的ItemPlaceholderID设为分组容器里面的html容器id,GroupPlaceholderID设为分组容器的id,只是别忘了,分组容器因为是在布局容器里的,所以就应该有两个runat="server"的容器,如上例,tr的runat="server"就应该在group里面再写一次,别以为写在layouttemplate就可以了。
发现也就这么回事,假如真要实现多列的话,要么你把它丢到一个table里,然后把模板设为td,不然的话,就只有丢到一个个div或li里,再用css来实现多列(以前我的一贯做法),所以本质上它最大的好处就是自带了一个分页吧
其实aspnetpager已经是一个相当好的控件了,只不过,我一直在寻找一个不需要控件的分页方式,甚至自己还写了分页类(当然只能url分页了,要模拟linkbutton也可以,但暂时觉得没那个必要,实在要做的话,只有触发__dopostback了),所以,既然这个datapager只能和listview一起用,那就把listview当成迭代器吧,毕竟这种情况下,分页既不需要自已写,也不需要用控件,呵呵。。。话说,这么懒的话,一般只能用在企业项目中了,互联网项目可是体验优先,想懒是不可能的:)
不过,既然所有的模板都在"placeholder"里面,那么你显然应该知道了,里面的所有控的ID会没有悬念地加上placeholder的id前缀,写css或页面脚本的时候要注意了,免得找不到控件。。。