1.2.5 ListView控件和DataPager控件
ListView可以看成是DataGrid和Repeater的结合体,它既有Repeater控件的开放式模板,又具有DataGrid控件的编辑特性,基于这点,也一定能引起您的兴趣吧。它提供了比DataGird丰富得多的布局手段,同时还具有DataGrid的所有特性。但是ListView控件本身并不提供分页功能,需要通过另外一个分页控件来协助完成整体功能:DataPager控件,ASP.NET 3.5中专门的分页控件。之所以会把这个分页功能单独提出来,其用意就是方便其他可能需要分页功能的控件使用。也可以理解为DataPager就是一个扩展ListView分页功能的控件。和其他数据源控件一样,ListView也是用来显示数据的,它的使用类似于Repeater控件。在ListView控件中包含很多模板以方便使用,比如:InsertItemTemplate是用于添加记录的(在DataGird中没有这个模板), LayoutTemplate是ListView的一个布局模板,它用来决定包裹着详细内容的容器的标记。可以根据需要在布局模板内放置任何控件,但前提是它必须是服务端控件。在使用ListView控件的时候,还需要指定ListView控件的ItemContainerID属性,它用来告知ListView在哪个容器下显示详细内容。
参考如下示例:
<asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource1" ItemContainerID="layoutTableTemplate"> <LayoutTemplate> <div> <table cellpadding="5"> <thead> <tr> <th> Title</th> <th> BirthDate</th> </tr> </thead> <tbody id="layoutTableTemplate" runat="server"> </tbody> </table> </div> </LayoutTemplate> <ItemTemplate> <tr> <td valign="top"> <%# Eval("Title") %></td> <td valign="top"> <%# Eval("BirthDate") %></td> </tr> </ItemTemplate> </asp:ListView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString2 %>" SelectCommand="SELECT [Title], [BirthDate] FROM [Employees] ORDER BY [BirthDate]"> </asp:SqlDataSource>
该例使用<table/>来做ListView显示的详细内容的容器,并且它还有一个固定表头的功能。请注意上面的布局模板,特别是其中的<TBODY/>部分。ItemTemplate会将其内生成的详细内容插入到<TBODY/>之中。
当然如果你想为ListView增加分页功能的话,那么就需要使用DataPager控件了。前面讲过,这个分页控件是一个独立的控件,可以把它放到页面的任何位置,然后使其关联到你的ListView控件就可以完成分页的工作。该分页控件所呈现出来的HTML标记为内联(Inline)元素,所以如果需要精确地设置其位置的话,可以参考下面的代码,为其包裹一个<div/>标记。
<div > <asp:DataPager ID="PagerDemo" runat="server" PagedControlID=" ListView1" PageSize="5"> <Fields> <asp:NumericPagerField ButtonCount="10" NextPageText="" Previous PageText="" /> <asp:NextPreviousPagerField FirstPageText="First" LastPageText= "Last" NextPageText="Next" PreviousPageText="Previous" /> </Fields> </asp:DataPager> </div>
通过这段代码会发现,可以通过设置DataPager控件的Fields,从而达到手动设置分页布局的目的。另外还有一个关键点,就是DataPager控件的PagedControlID属性,需要把它设置为ListView的ID。当然也可以把DataPager控件放到布局模板内。把分页功能作为一个单独的控件分离出来是一个非常好的习惯,它会让我们有更多的布局和显示上的自由度。但是,目前的分页控件还是有其局限性的。其缺点是它只能结合ListView控件一起工作,目前还不支持在Repeater或GridView上的分页功能。另外它也是依赖于ViewState的,没有分页事件,也没有SelectedPageIndex属性。还有一点需要注意的是,ListView没有内置排序功能。