摘要:
很多人可能在以前的ASP.NET版本中就已经用到ListView控件了,但是那个应该是第三方的控件。这回Microsoft将在ASP.NET中引入ListView控件,这个控件将DataList, FormView, 和 GridView 控件的功能集成到一个控件中。同DataList 和 Repeater控件一样,他通过模板和样式表来格式化你所绑定的数据并呈现输出,然而他又能支持排序,更新,分页和删除等。本文将讲述ListView的一些基础知识,下面我们一起来看看吧!
绑定数据:
ASP.NET中的每一个数据控件都能够进行绑定,ListView控件提供两种方法进行数据绑定。
<!--[if !supportLists]--><!--[endif]-->
<!--[if !supportLists]--> 1. <!--[endif]-->DataSourceID属性来绑定数据,这里需要用到的是数据源控件,这样ListView就能够像GridView一样支持数据源控件的分页,排序,更新和删除等。
<!--[if !supportLists]--> 2. <!--[endif]-->通过DataSource属性来进行绑定,这个一般都用与编程绑定,这就需要我们通过代码来进行分页,排序,删除和更新等,这样就支持自定义分页等等,适合大量数据时使用。
模板:
以下是创建所能够涉及到的模板,有很多中选择,可以是单独的一项,也可以分组。
根模板在此模板中定义对象容器,我们可以在此定义如table,div和span标签等,而把内容定义在ItemTemplates,GroupTemplate及DataPager等中。在例子中我们将讲述以下怎样应用这些模板。
ItemTemplate
这个模板只要有用过Repeater等控件的人都知道,它可以循环呈现数据。
分割模板。
分组定义数据,我们可以在此模板中定义如table row(tr),div或span等,而把数据内容定义在ItemTemplate 和 EmptyItemTemplate模板中。
分组分割模板。
当应用GroupSeparatorTemplate模板时用于呈现无内容的模板,例如:如果我们将GroupItemCount设置为10,而我们的实际数据只有8条,当呈现内容是就会有两条内容呈现EmptyItemTemplate模板所定义的内容。
当数据源为空时所要显示的内容。
被选择时呈现的模板。
层叠替换模板,定义的内容和ItemTemplate一样。
和GridView一样,编辑时呈现的内容。
插入模板。
创建ItemTemplate:
其实控件的使用都差不多,用多了也就明白了,最主要的是用于实践。创建ItemTemplate很简单,从中我们也可以看到LayoutTemplate的应用,在Repeater中头尾要分别定义在Header和Footer中,而ListView直接定义可谓是一大进步啊。
1 <asp:ListView runat="server" ID="EmployeesListView" DataSourceID="EmployeesDataSource" DataKeyNames="EmployeeID">
2 <LayoutTemplate>
3 <table align="center">
4 <tr>
5 <td>
6 <table cellpadding="2" runat="server" id="itemContainer" style="width:460px">
7 </table>
8 </td>
9 </tr>
10 <tr>
11 <td align="center">
12 <asp:DataPager runat="server" ID="DataPager" CssClass="pager" PageSize="4">
13 <Fields>
14 <asp:NumericPagerField
15 ButtonCount="5"
16 PreviousPageText="<--"
17 NextPageText="-->" />
18 </Fields>
19 </asp:DataPager>
20 </td>
21 </tr>
22 </table>
23 </LayoutTemplate>
24 <ItemTemplate>
25 <tr>
26 <td valign="top" colspan="2" align="center" class="EmployeeName">
27 <asp:Label ID="FirstNameLabel" runat="Server" Text='<%#Eval("FirstName") %>' />
28 <asp:Label ID="LastNameLabel" runat="Server" Text='<%#Eval("LastName") %>' />
29 </td>
30 </tr>
31 <tr style="height:72px">
32 <td valign="top" class="EmployeeInfo">
33 <asp:Label ID="JobTitleLabel" runat="Server" Text='<%#Eval("JobTitle") %>' />
34 <br />
35 <asp:HyperLink ID="EmailAddressLink" runat="Server" Text='<%#Eval("EmailAddress") %>' NavigateUrl='<%#"mailto:" + Eval("EmailAddress") %>' />
36 <br />
37 <asp:Label ID="PhoneLabel" runat="Server" Text='<%#Eval("Phone") %>' />
38 </td>
39 <td valign="top" class="EmployeeAddress">
40 <asp:Label ID="AddressLine1Label" runat="Server" Text='<%#Eval("AddressLine1") %>' />
41 <br />
42 <asp:Panel ID="AddressLine2Panel" runat="server" Visible='<%#Eval("AddressLine2").ToString() != String.Empty %>'>
43 <asp:Label ID="AddressLine2Label" runat="Server" Text='<%#Eval("AddressLine2").ToString()%>' />
44 <br />
45 </asp:Panel>
46 <asp:Label ID="CityLabel" runat="Server" Text='<%#Eval("City") %>' />,
47 <asp:Label ID="StateProvinceNameLabel" runat="Server" Text='<%#Eval("StateProvinceName") %>' />
48 <asp:Label ID="PostalCodeLabel" runat="server" Text='<%#Eval("PostalCode") %>' />
49 <br />
50 <asp:Label ID="CountryRegionNameLabel" runat="Server" Text='<%#Eval("CountryRegionName") %>' />
51 </td>
52 </tr>
53 </ItemTemplate>
54 </asp:ListView>
55
利用ListView分页:
其实还是要靠自定义分页这样才能对大数据进行检索,如果直接用内置的效率将是非常地的,我们这里先看看内嵌的分页功能。
1 <asp:DataPager runat="server" ID="EmployeesDataPager" CssClass="pager" PageSize="8">
2 <Fields>
3 <asp:TemplatePagerField>
4 <PagerTemplate>
5
6 <asp:TextBox ID="CurrentRowTextBox" runat="server"
7 AutoPostBack="true"
8 Text="<%# Container.Pager.StartRowIndex + 1%>" Columns="1" style="text-align:right" OnTextChanged="CurrentRowTextBox_OnTextChanged" />
9 to
10 <asp:Label ID="PageSizeLabel" runat="server" Font-Bold="true"
11 Text="<%# Container.Pager.StartRowIndex + Container.Pager.PageSize > Container.Pager.TotalRowCount ? Container.Pager.TotalRowCount : Container.Pager.StartRowIndex + Container.Pager.PageSize %>" />
12 of
13 <asp:Label ID="TotalRowsLabel" runat="server" Font-Bold="true"
14 Text="<%# Container.Pager.TotalRowCount %>" />
15 </PagerTemplate>
16 </asp:TemplatePagerField>
17 <asp:NextPreviousPagerField
18 ShowFirstPageButton="true" ShowLastPageButton="true"
19 FirstPageText="|<< " LastPageText=" >>|"
20 NextPageText=" > " PreviousPageText=" < " />
21 </Fields>
22 </asp:DataPager>
23
后台代码:
2 {
3 TextBox t = (TextBox)sender;
4 DataPager pager = (DataPager)EmployeesListView.FindControl( " EmployeesDataPager " );
5 pager.SetPageProperties(Convert.ToInt32(t.Text) - 1 , pager.PageSize, true );
6 }
7
排序:
利用CommandArgument属性的定义来对数据进行排序。代码如下:1 <asp:ListView runat="server" ID="ListView1" DataSourceID="SqlDataSource1">
2 <LayoutTemplate>
3 <asp:LinkButton runat="server" ID="SortButton"
4 Text="Sort" CommandName="Sort" CommandArgument="LastName" />
5 <table runat="server" id="itemContainer">
6 </table>
7 <asp:DataPager runat="server" ID="DataPager" PageSize="20">
8 <Fields>
9 <asp:NumericPagerField ButtonCount="10"
10 PreviousPageText="<--"
11 NextPageText="-->" />
12 </Fields>
13 </asp:DataPager>
14 </LayoutTemplate>
15 <ItemTemplate>
16 <tr runat="server">
17 <td><asp:Label runat="server" ID="FirstNameLabel"
18 Text='<%# Eval("FirstName")' /></td>
19 <td><asp:Label runat="server" ID="LastNameLabel"
20 Text='<%# Eval("LastName")' /></td>
21 </tr>
22 </ItemTemplate>
23 </asp:ListView>
24
2 {
3 if (e.SortExpression.Trim() == "" ) { return ; }
4
5 string direction = "" ;
6 if (ViewState[ " SortDirection " ] != null )
7 direction = ViewState[ " SortDirection " ].ToString();
8
9 if (direction == " ASC " )
10 direction = " DESC " ;
11 else
12 direction = " ASC " ;
13
14 ViewState[ " SortDirection " ] = direction;
15
16 string [] sortColumns = e.SortExpression.Split( ' , ' );
17 string sortExpression = sortColumns[ 0 ] + " " + direction;
18 for ( int i = 1 ; i < sortColumns.Length; i ++ )
19 sortExpression += " , " + sortColumns[i] + " " + direction;
20 e.SortExpression = sortExpression;
21 }
22
总结:
我们只要能够把其中一个数据控件用的很熟悉,就知道其他控件的基本用法了,掌握了他的事件驱动,再用其他的控件都是大同小异没什么差别。本文只是为了介绍这个控件,由于在Orcas Beta1中还没有这个控件的出没,无意中我看到了介绍此控件的文章,所以写写加上翻翻就成就了此文。