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没有内置排序功能。