显示表格数据是软件开发中的一个周期性任务。ASP.NET 提供了许多工具来在网格中显示表格数据,例如 GridView 控件。通过使用 GridView 控件,您可以显示、编辑和删除多种不同的数据源(例如数据库、XML 文件和公开数据的业务对象)中的数据。
1. GridView数据绑定基础
GridView大部份场合下都是用来绑定数据源,进行数据的显示。一般情况下,可以绑定到SqlDataSource控件,DataTable对象,DataView对象..也可以绑定到列表对象。
GrdiView提供了两种数据方式的绑定:DataSourceID与DataSource
● 使用 DataSourceID 属性进行数据绑定,此选项使您能够将 GridView 控件绑定到数据源控件。使用 DataSourceID 属性绑定到数据源时,GridView 控件支持双向数据绑定。除可以使该控件显示返回的数据之外,还可以使它自动支持对绑定数据的更新和删除操作。
● 使用 DataSource 属性进行数据绑定,此选项使您能够绑定到包括 ADO.NET 数据集和数据读取器在内的各种对象。此方法需要为所有附加功能(如排序、分页和更新)编写代码。
GridView会自动为一个布尔类型字段呈现复选框。
例1:GridView绑定到一个List对象中
<script runat=”server”>
public class CartItem{
private int _id;
public string _description;
public int Id{
get { return _id; }
}
public string Description{
get { return _description; }
}
public CartItem(int id,string description){
_id = id;
_description = description;
}
}
public partial class employeeManage_schoolyardPlay : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack){
List<CartItem> shoppingCart = new List<CartItem>();
shoppingCart.Add(new CartItem(1, "notebook Computer"));
shoppingCart.Add(new CartItem(2, "HD Plasma Televsion"));
shoppingCart.Add(new CartItem(3, "Lava Lamp"));
GridView2.DataSource = shoppingCart;
GridView2.DataBind();
}
}
</script>
<asp:GridView ID="GridView2" runat="server" AllowPaging="True"
AutoGenerateColumns="False" PageIndex="2">
<Columns>
<asp:BoundField DataField="Id" HeaderText="编号 " />
<asp:BoundField DataField="Description" HeaderText="描述" />
</Columns>
</asp:GridView>
2. 获取GridView被选中行的信息。
2.1 GridView有两个属性:一个叫AutoGenerateSelectButton,一个叫DataKeyNames。
AutoGenerateSelectButton设置为true时,GridView就会出现一个选择键。而DataKeyNames则表示获取或设置一个数组,该数组包含了显示在 GridView 控件中的项的主键字段的名称。当用户点击选择时,就可以取出主键字段的值。取GridView选中的值是通过GridView的SelectedValue属性来实现的。
例2:点击选择获得主键的值
点击选择获得主键的值 当然,如果以上设置DataKeyName为Description,则点击选择后Label显示的为选择行的Description值。
例3:一个主从GridView例子
主从GridView
2.2 除了SelectVaule可以获得被选中行的信息以外,还有几个属性可以获得被选中行的信息
● SelectedDataKey : 返回被选中行相关的DataKey对象。*有多个数据键时很有用*
● SelectedIndex : 返回选中行的索引(从零计算)
● SelectedValue : 返回选中行的数据键值
● SelectedRow : 返回被选中的行,返回GridViewRow对象。
2.3 为DataKeyNames绑定多个关键值
为DataKeyNames绑定多个关键值很简单,字符串内各键值以,分隔就可以了,如:
<asp:GridView id=”grdEmployees” DataSourceID=”srcEmployees”
DataKeyNames=”LastName,FirstName” AutoGenerateSelectButton=”true” Runat=”server” />
在绑定多个关键值的情况下,取值就不是使用SelectedValue了,而是使用SelectedDataKey属性,如:
<asp:SqlDataSource id=”srcEmployeeDetails” ConnectionString=”<%$ ConnectionStrings:Employees %>”
SelectCommand=”SELECT * FROM Employees WHERE FirstName=@FirstName AND LastName=@LastName” Runat=”server”>
<SelectParameters>
<asp:ControlParameter Name=”FirstName” ControlID=”grdEmployees” PropertyName=’SelectedDataKey(“FirstName”)’ />
<asp:ControlParameter Name=”LastName” ControlID=”grdEmployees” PropertyName=’SelectedDataKey(“LastName”)’ />
</SelectParameters>
</asp:SqlDataSource>
2.4 GridView的DataKey属性
DataKey表示的是获取一个 DataKey 对象集合,这些对象表示 GridView 控件中的每一行的数据键值。
public virtual DataKeyArray DataKeys { get; }
怎么使用DataKey呢?如果知道要取GridView1第六行的DataKey键值,可以这样写:
Object key = GridView1.DataKey[5].Value;
如果组键有多个键值,可以这样取:
Object key = GridView1.DataKey[5].Values("LastName");
如果在SelectedIndexChanged事件中,可以这样写:
int index = CustomersGridView.SelectedIndex;
Message.Text = CustomersGridView.DataKeys[index].Value.ToString() ;
备注:关于DataKey对象
3. GridView数据排序
3.1 如何启用排序
启用GridView的AllowSorting属性可以对呈现的数据行进行排序。排序支持顺序和逆序排序。多次点击,排序就在顺序和逆序间切换
【注:显式指定GridView控件列时(例如绑定列),需要指定此列的SortExpression值才能支持排序。否则,点击此列标题不会对数据排序,切记切记。】
3.2 AJAX排序
声明GridView的EnableSortingAndPagingCallbacks属性为TRUE就可以启用AJAX排序。AJAX排序不会把整个页面都递交到服务器上。只有GridView才会被更新
【注:在GridView中使用AJAX,就不能使用TemplateFields,也不会显示Selected按钮】
3.3 定义排序界面外观
通过响应GridView的RowDataBound事件就可以定制排序链接的外观
例4:自定义排序标题外观
自定义排序标题外观
3.4 用代码控制进行排序
可以在代码中调用GridView.Sort()方法来对GridView排序:
public virtual void Sort( string sortExpression, SortDirection sortDirection);
例5:后台代码控制排序:
后台控制排序 4.GridView的分页
一般情况下,把GridView的AllowPaging属性设置成TURE就可以支持分页。通过修改PageSize属性可以指定每页显示的记录数。默认为10
设置EnableSortingAndPagingCallBacks为true就可以使用AJAX进行分页。
4.1 自定义分页
默认情况下,GridView会在网格底部显示页码。通过修改GridView的PagerSettings属性可以修改分页界面
PagerSettings 获取对 PagerSettings 对象的引用,使用该对象可以设置 GridView 控件中的页导航按钮的属性。
public virtual PagerSettings PagerSettings { get; }
关于GridView分页中的导航设定,分别涉及到三个属性:
● PagerSettings: PagerSettings 对象的引用,使用该对象可以设置 GridView 控件中的页导航按钮的属性。
● PagerStyle:获取对 TableItemStyle 对象的引用,使用该对象可以设置 GridView 控件中的页导航行的外观。
● PagerTemplate:获取或设置 GridView 控件中页导航行的自定义内容。
4.2 PagerSettings对象
上一节提到PagerSettings属性可以设置导航按钮的属性,其返回的是一个PagerSettings对象。这个对象又具备一些重要属性,真是属性套属性啊。
● FirstPageImageUrl : 第一个按钮显示的图像URL
● FristPageText :第一页按钮显示的文字 。
● LastPageImageUrl、LastPageText、NextPageImageUrl、NextPageText、PreviousPageImageUrl、PreviousPageText :介绍略
● Mode:分页显示模式,支持NextPrevious、NextPreviousFirstLast、Numeric、NumbericFirstLast
● PagetButtonCount:页按钮的数量,
如果数据多的场合,显示所有的页码链接非常不现实,设定PagetButtonCount,最多小面显示多少个页码,其它的用省略号表示。
● Position:分页界面的显示位置
● Visible:是否显示
例6:自定义分页导航
Code
4.3 使用模板显示导航页:PageTemplate属性
使用PageTemplate属性,可以自定义导航显示的样式,导航栏可以加入任何asp.net服务器控件(button,ImageButton,LinkButton)。使用PageTemplate,按以下语法使用
<asp:GridView>
<PagerTemplate>ITemplate</PagerTemplate>
</asp:GridView>
一个 System.Web.UI.ITemplate,包含页导航行的自定义内容。默认值为 null,表示未设置此属性。
在PageTemplate加入的Button控件,把CommandName属性设定为Page,CommandArgument属性设为以下四个值之一,就可以进行页面导航:
● Next:导航至下一页
● Prev:导航至上一页
● First:导航至首页
● Last:导航至末页
● Interger:导航至指定页码
不止可以加入Button型控件,也可以加入BulletedList,DropdownList,Menu等控件,进行导航,点击相应的Item时,只要设定与之对应gridView.PageIndex即可。GridView会自动帮你链接到相应的页面。
例7:使用PageTemplate进行导航,使用Menu控件和Button控件结合进行导航
Code
小技巧:可以使用@page指令中的MaintainScrollPositionOnPostback属性,通过它可以使页面无论在什么时候回发都定位到相同的位置。
5.编辑数据
5.1.空数据如何显示
默认的,没有任何结果从数据源返回的时候,GridView是不进行显示的,这时,可以通过GridView的两个属性来显示没有数据时应该显示的内容。
● EmptyDataText:获取或设置在 GridView 控件绑定到不包含任何记录的数据源时所呈现的空数据行中显示的文本。
● EmptyDataTemplate: 获取或设置在 GridView 控件绑定到不包含任何记录的数据源时所呈现的空数据行的用户定义内容。
以上,EmptyDataText比较简单,当数据为空时,GridView显示的位置会显示其中的内容,内容可以包含HTML标记,
例8:EmptyDataText属性设定
<asp:GridView id=”grdMovies” DataSourceID=”srcMovies”
EmptyDataText=”<img src=’sad.gif’/> No Matching Movies!” Visible=”false” Runat=”server” />
而EmptyDataTemplate可以在其中加入相应的服务器控件,显示成任何想显示的样子,格式如下:
<asp:GridView>
<EmptyDataTemplate>ITemplate</EmptyDataTemplate>
</asp:GridView>
例9:EmptyDataTemplate属性设定
Code
5.2 格式化GridView控件
GridView有丰富的格式化属性,这些属性可以修改GridView的外观。GridVie本身有CssClass属性,但也暴露了以下Style的属性,Style对象也具有CssClass属性
● AlternationRowStlye: 可以设置交替行的外观
● FooterStyle:可以设置脚注行的外观
● HeaderStyle:可以设置标题行的外观
● PagerStyle:可以设置导航页的外观
● RowStyle: 可以设置交替行的外观,与AlternationRowStlye交互
● SelectedRowStyle: 设置选中行的外观
例10:使用CSS控制Gridview的外观
Code 除了以上属性外,还有几个比较有用的格式属性,如:
● GridLines: 网格边框属性,可以取值为Both,Vertical,Horizontal和None
● ShowFooter: 如果为True,则将在GrdiView的底部输出脚注行
● ShoeHeader: 如果为TRUE,则将输出标题行
5.3 GridView中的ViewState
默认场合,GridView控件保存呈现在ViewState中的所有行和列的值,这些数据都保存在一个隐藏表单字段中。
使用ViewState的好处是GridView不需要每次翻页时都去数据库获取同样的记录集合,而只要页面初次加载就可以了(!IsPostback)
但是,数据量大的时候,使用ViewState也会成为负担,所以禁用ViewState非常有必要
所以,设置GridView的EnableViesState属性为FALSE就可以禁用ViewState。
6. GridView控件中使用字段(FieldType)
请详见以下文章: http://www.cnblogs.com/shipfi/archive/2009/10/17/1585219.html
7. GridView控件的事件
请详见以下文章: http://www.cnblogs.com/shipfi/archive/2009/10/18/1585453.html
8.扩展GridView
详见以下文章:http://www.cnblogs.com/shipfi/archive/2009/10/18/1585647.html
9. 一些常用技巧
● 使用列汇总:有时需要在数据列的底部显示某字段的汇总信息,汇总信息可以在FooterRow中显示,通过DataBound事件来进行列值的累计
例11:显示列汇总
<script runat=”server”>
private decimal _boxOfficeTotalsTotal = 0;
protected void grdMovies_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow) {
decimal boxOfficeTotals = (decimal)DataBinder.Eval(e.Row.DataItem, "BoxOfficeTotals");
_boxOfficeTotalsTotal += boxOfficeTotals;
}
if (e.Row.RowType == DataControlRowType.Footer) {
Label lblSummary = (Label)e.Row.FindControl("lblSummary");
lblSummary.Text = String.Format("Total: {0:c}", _boxOfficeTotalsTotal);
}
}
</script>
<asp:GridView id=”grdMovies” DataSourceID=”srcMovies” OnRowDataBound=”grdMovies_RowDataBound”
AutoGenerateColumns=”false” ShowFooter=”true” Runat=”server”>
<Columns>
<asp:BoundField DataField=”Title” HeaderText=”Title” />
<asp:TemplateField HeaderText=”Box Office Totals”>
<ItemTemplate> <%# Eval(“BoxOfficeTotals”, “{0:c}”) %> </ItemTemplate>
<FooterTemplate><asp:Label id=”lblSummary” Runat=”server” /></FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView> ● 嵌套主从表: 使用GridView中的TemplateField,该Field中再套GridView,另外通过RowDataBound变更TemplateField中的SqlDataSource属性
例12: 嵌套的主从表
<script runat="server">
protected void grdMovieCategories_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow) {
int categoryId = (int)DataBinder.Eval(e.Row.DataItem,"Id");
// TemplateField中获取SqlDataSource控件,必须使用FindControl方法
SqlDataSource srcMovies = (SqlDataSource)e.Row.FindControl(“srcMovies");
srcMovies.SelectParameters[“CategoryId"].DefaultValue = categoryId.ToString();
}
}
</script>
<style type="text/css">
.categories h1 {
font:bold 16px Arial, Sans-Serif;
}
.movies {
margin-left:20px;
margin-bottom:10px;
width:100%;
}
</style>
<asp:GridView id="grdMovies" DataSourceID="srcMovieCategories"
OnRowDataBound="grdMovieCategories_RowDataBound" AutoGenerateColumns="false"
ShowHeader="false" GridLines="none" CssClass="categories" Runat="server">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<h1><%# Eval(“Name") %></h1>
<asp:GridView id="grdMovies" DataSourceId="srcMovies" CssClass="movies"
GridLines="none" Runat="server" />
<asp:SqlDataSource id="srcMovies" ConnectionString="<%$ ConnectionStrings:Movies %>"
SelectCommand="SELECT Title,Director FROM Movies WHERE CategoryId=@CategoryId" Runat="server">
<SelectParameters>
<asp:Parameter Name="CategoryId" />
</SelectParameters>
</asp:SqlDataSource>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource id="srcMovieCategories" ConnectionString="<%$ ConnectionStrings:Movies %>"
SelectCommand="SELECT Id,Name FROM MovieCategories" Runat="server" />