ListView 基础
ListView 是模板驱动的控件,这意味着它默认情况下不会呈现任何数据——您必须以模板的形式完全指定希望它呈现的 HTML。与大多数模板控件类似,ItemTemplate 将成为您工作的重点,您需要将绑定数据集中每一行不断重复的 HTML 内容放在 ItemTemplate 里。
ListView 中的新功能,也是它与其它控件的真正不同之处在于引进了 LayoutTemplate。在 LayoutTemplate 中,您可以将要输出的顶级 HTML 定义为控件呈现的内容。例如,如果希望 ListView 作为表格呈现,则可以在 LayoutTemplate 中包含顶级 <table> 和 <thead> 元素,把行和单元格的呈现留给 ItemTemplate,如图 1 所示(在本示例中,绑定的数据源将显示包含电影标题和发行日期的简单表格)。图 2 显示了浏览器呈现。
Figure 1 Using LayoutTemplate and ItemTemplate
复制代码
<asp:ListView runat="server" ID="_simpleTableListView" DataSourceID="_moviesDataSource"> <LayoutTemplate> <table> <thead> <tr> <th>ID</th> <th>Title</th> <th>Release Date</th> </tr> </thead> <tbody> <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> </tbody> </table> </LayoutTemplate> <ItemTemplate> <tr> <td><%# Eval("movie_id") %></td> <td><%# Eval("title") %></td> <td><%# Eval("release_date", "{0:d}") %></td> </tr> </ItemTemplate></asp:ListView>
Figure 2 显示在表格中的列表 (单击该图像获得较大视图)
LayoutTemplate 和 ItemTemplate 之间的关联由 LayoutTemplate 中 ID 设置为 itemPlaceholder 的单一服务器端控件完成。(您可以使用 ListView 的 ItemPlaceholderID 属性更改 ID 字符串的默认值。)在第一个示例中,我将 PlaceHolder 控件的实例放置在模板中,即我希望注入 ItemTemplate 内容的位置。请注意:尽管必须支持子控件,但并没有限制必须使用什么类型的控件作为占位符——ID 才是重要。例如,我可以使用服务器端表格行代替 PlaceHolder 控件编写 LayoutTemplate,实现同样的效果:
复制代码
<LayoutTemplate> <table> <thead> <tr> <th>ID</th> <th>Title</th> <th>Release Date</th> </tr> </thead> <tbody> <tr runat="server" ID="itemPlaceholder" /> </tbody> </table></LayoutTemplate>通常情况下,出于以下两个原因,我更喜欢使用通用的 PlaceHolder 控件。第一个原因是名称匹配得很好。而且,该控件并不呈现其自身的 HTML,而是用 ItemTemplate 的内容代替,因此如果控件除在层次结构中保留位置以外无任何其它目的,这是更合乎逻辑的选择。
当然,使 ListView 如此灵活的原因是您可以完全控制 LayoutTemplate 的内容。您不是只能使用表格——您可以将任何希望呈现的 HTML 放置在 LayoutTemplate 中,只要注入 itemPlaceholder 控件位置时 ItemTemplate 的内容有效即可。以下是绑定到相同电影数据源的 ListView 示例,但这次不是表格,是带有标题和发行日期的电影显示在项目符号列表中(结果列表如图 3 所示):

Figure 3 相同列表,不同格式 (单击该图像获得较大视图)
复制代码
<asp:ListView runat="server" ID="_simpleTableListView" DataSourceID="_moviesDataSource"> <LayoutTemplate> <ul> <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> </ul> </LayoutTemplate> <ItemTemplate> <li><%# Eval("title") %>, <%# Eval("release_date", "{0:d}") %> </li> </ItemTemplate> </asp:ListView>ListView 和 CSS
ASP.NET 开发人员长久以来在创建 CSS 驱动的站点时都受到单独控件的限制。许多默认控件呈现内联样式,或者难于使 CSS 类与其 HTML 输出部分相关联。实际上 Microsoft 在 2006 年 4 月已发布名为“CSS 控件适配器”的工具包,该工具包为几个完全由 CSS 驱动的控件(包括 GridView)提供了可选呈现机制,帮助纠正该问题(有关详细信息,请参见 2006 年 10 月的“非常 ASP.NET”专栏 msdn.microsoft.com/msdnmag/issues/06/10/ExtremeASPNET)。这些备用呈现机制从未并入完整版当中,所以需要单独安装且缺少设计人员支持。
ListView 通过让您完全控制何时何地应用样式表,使您在站点里利用 CSS 变得更为简捷。一种常见的情形是开发人员为特定页面手动预先设计,通常包含 HTML 和 CSS。采用传统的 GridView 呈现数据表的特定设计总是很难保证正确,因为 GridView 类仅提供用于修改 HTML 结果的有限挂接集。
我见过许多开发人员经历过的试验和错误,将样式属性应用到网格,查看页面源以准确理解样式放置的位置,并反复试验直到网格能够按要求呈现为止。使用 ListView,您不必再做这些猜测工作了,因为现在您可以控制布局和内容。
例如,假设提供给您的表格需要按照图 4 所示的方式显示,并使用由 .htm 和 .css 文件组成的设计,如图 5中所示。
Figure 5 HTML and CSS for the Table


HTML
复制代码
<div class="PrettyGrid"> <table cellpadding="0" cellspacing="0" summary=""> <thead> <tr> <th scope="col"><a href="复制代码
<asp:DataPager ID="_moviesGridDataPager" runat="server" QueryStringField="pageNum" > <Fields> <asp:NumericPagerField /> </Fields></asp:DataPager>请注意:因为 DataPager 完全依赖 ListView 执行实际的数据分页,而 ListView 又依赖 DataSource 控件,所以对于其它数据绑定控件也存在相同的分页限制。例如,对于 SqlDataSource 控件,仅当其设置为 DataSet 模式时分页才能正常工作,这意味着需要将整个结果集加载到内存中才能执行分页。当然,您可以使用自定义 DataSource 控件或使用 ObjectDataSource 控件自定义自己的分页。
排序、编辑、插入和删除
如果 ListView 不具备支持排序和完备的创建、读取、更新和删除 (CRUD) 操作,那么它是不完整的。它实现每种命令的方式与 FormView 控件实现命令的方式相似。
因为 ListView 完全由模板驱动,所以对于其模板中将 CommandName 属性设置为以下七种特定命令字符串之一的按钮,能够予以识别:Cancel(取消)、Delete(删除)、Select(选择)、Edit(编辑)、Insert(插入)、Update(更新)和 Sort(排序)。每个命令都会启动 ListView 中的相应操作——这样如果希望为 ListView 添加排序,那只需要在 LayoutTemplate 中放置一个按钮(图 8 的示例中使用 LinkButton),将其 CommandName 属性设置为 Sort,并将 CommandArgument 设置为希望数据源进行排序的列名称。在图 8 中,我将以前网格中每列的静态标题链接修改为可单击的链接,通过单击该链接可以请求 ListView 根据该列对数据进行排序。
Figure 8 Sorting in ListView
复制代码
<asp:ListView ID="_moviesGrid" runat="server" DataKeyNames="movie_id" DataSourceID="_moviesDataSource"> <LayoutTemplate> <div class="PrettyGrid"> <table cellpadding="0" cellspacing="0" summary=""> <thead> <tr> <th scope="col"> <asp:LinkButton ID="_movieIdSortLink" CommandName="Sort" CommandArgument="movie_id" runat="server">ID</asp:LinkButton> </th> <th scope="col"> <asp:LinkButton ID="_titleSortLink" CommandName="Sort" CommandArgument="title" runat="server">Title</asp:LinkButton> </th> <th scope="col"> <asp:LinkButton ID="_releaseDateSortLink" CommandName="Sort" CommandArgument="release_date" runat="server">Release date</asp:LinkButton> </th> </tr> </thead> <!-- ... --> </LayoutTemplate></asp:ListView>您可以为启动编辑模式、删除行或在数据集中插入新行添加命令按钮,详细过程与其它基于模板的数据绑定控件(如 FormView 和 GridView)基本相同,此处就不再赘述。
分组
ListView 的最后一个主要功能是将数据分组成子集的能力,非常类似于 DataList 控件提供的功能。DataList 是表格格式的控件,它可以在所呈现数据表的每个单元格中呈现单行数据。您可以通过设置 RepeatColumns 属性来控制将基础数据集的多少行归入单个表格行中。
由于 ListView 并不仅限于呈现表格,所以它需要更加一般的方式指定将组合呈现的项目组,而这正是 GroupTemplate 提供的方式。图 9 显示了 ListView 中 LayoutTemplate、GroupTemplate 和 ItemTemplate 元素之间的关系。GroupTemplate 可以为基础数据集中每 n 个元素指定外围 HTML,其中 n 的值由 ListView 的 GroupItemCount 属性指定。

Figure 9 ListView 中的模板 (单击该图像获得较大视图)
当在 ListView 中使用 GroupTemplate 时,不需要再在 LayoutTemplate 中指定带有 itemPlaceholder ID 的控件——该控件现在需要位于 GroupTemplate 之内。而是需要在 LayoutTemplate 中指定带有 groupPlaceholder ID 的控件(可以通过设置 ListView 的 GroupPlaceholderID 属性更改控件 ID)以说明对于基础数据集中每 n 个项目,应在哪个位置注入 GroupTemplate 的内容。
例如,图 10 中的 ListView 显示了如何通过将 GroupTemplate 定义为搜索行,并将 ItemTemplate 设为仅布局单元格,以在表格的每一行中显示来自数据库的四个电影。结果如图 11 所示。
Figure 10 Defining Rows with GroupTemplate
复制代码
<asp:ListView ID="_groupListView" runat="server" DataKeyNames="movie_id" DataSourceID="_moviesDataSource" GroupItemCount="4" > <GroupTemplate> <tr> <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> </tr> </GroupTemplate> <LayoutTemplate> <table> <asp:PlaceHolder ID="groupPlaceholder" runat="server" /> </table> </LayoutTemplate> <ItemTemplate> <td> movie_id: <asp:Label ID="_movie_idLabel" runat="server" Text='<%# Eval("movie_id") %>' /> <br /> title: <asp:Label ID="_titleLabel" runat="server" Text='<%# Eval("title") %>' /> <br /> release_date: <asp:Label ID="_release_dateLabel" runat="server" Text='<%# Eval("release_date", "{0:d}") %>' /> <br /> <br /> </td> </ItemTemplate></asp:ListView>
Figure 11 结果 Web 页面中的 GroupTemplate 行 (单击该图像获得较大视图)
这与使用 DataList 完成的工作非常相似,但因为使用的是 ListView,所以可以像前面所示的网格呈现一样轻松添加分页和排序功能,而使用 DataList 完成这些工作则非常复杂。用于本文的下载代码包含实现了分页和排序功能的示例供您参考。
开始执行 ListView
您可能希望通过使用 Visual Studio 2008 中的设计器来试用 ListView 控件,该设计器可以提供五种不同的布局供您选择:网格、平铺、项目符号列表、流动和单行。您可以快速查看可用的各种布局选项——但 ListView 真正强大的功能在于您对它所呈现 HTML 的控制,所以在实际的项目中您很可能要自行构建 LayoutTemplate。您是否最后决定今后每次遇到数据绑定都使用 ListView 呢?虽然可能有点过头——但知道您会这样做我还是很高兴。我想今后我还会更多地研究这个灵活的数据绑定控件

本文来自CSDN博客,转载请标明出处:/lsd123/archive/2009/03/19/4004333.aspx

posted on 2011-05-23 23:01  专注NET开发  阅读(429)  评论(0编辑  收藏  举报