摘要:
很多人可能在以前的ASP.NET版本中就已经用到ListView控件了,但是那个应该是第三方的控件。这回Microsoft将在ASP.NET中引入ListView控件,这个控件将DataList, FormView, 和 GridView 控件的功能集成到一个控件中。同DataList 和 Repeater控件一样,他通过模板和样式表来格式化你所绑定的数据并呈现输出,然而他又能支持排序,更新,分页和删除等。本文将讲述ListView的一些基础知识,下面我们一起来看看吧!
绑定数据:
ASP.NET中的每一个数据控件都能够进行绑定,ListView控件提供两种方法进行数据绑定。
1. DataSourceID属性来绑定数据,这里需要用到的是数据源控件,这样ListView就能够像GridView一样支持数据源控件的分页,排序,更新和删除等。
2. 通过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直接定义可谓是一大进步啊。
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分页:
其实还是要靠自定义分页这样才能对大数据进行检索,如果直接用内置的效率将是非常地的,我们这里先看看内嵌的分页功能。
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属性的定义来对数据进行排序。代码如下: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中还没有这个控件的出没,无意中我看到了介绍此控件的文章,所以写写加上翻翻就成就了此文。