GridView控件是ASP.NET? 1.x的DataGrid控件的后继者。它是一个功能非常强大的通用控件,可以处理简单而常见的操作,如分页、排序、编辑或删除数据等。以尽可能少的数据实现双向数据绑定,该控件与新的数据源控件系列紧密结合,而且只要底层的数据源对象支持,它还可以直接处理数据源更新。它能定义多个主键字段、新的列类型以及样式和模板选项。
GridView支持大量属性,有如下几大类:行为、可视化设置、样式、状态和模板。
GridView的常用行为属性:
AllowPaging 指示该控件是否支持分页;
AllowSorting 指示该控件是否支持排序;
AutoGenerateColumns 指示是否自动地为数据源中的每个字段创建列,默认为True;
AutoGenerateDeleteButton 指示该控件是否包含一个按钮列以允许用户删除映射到被单击行的记录;
AutoGenerateEditButton 指示该控件是否包含一个按钮列以允许用户编辑映射到被单击行的记录;
AutoGenerateSelectButton 指示该控件是否包含一个按钮列以允许用户选择映射到被单击行的记录;
DeataMember 指示一个多成员数据中的特定表绑定到该网格。该属性与DataSource结合使用。如果DataSource是有一个DataSet对象,则该属性包含要绑定的特定表的名称;
DataSource 获得或设置包含用来填充该控件的值的数据源对象;
DataSourceID 指示所绑定的数据源控件;
EnableSortingAndPagingCallbacks 指示是否使用脚本回调函数完成排序和分页。默认情况下禁用;
RowHeaderColumn 用作列标题的列名,该属性旨在改善可访问性;
SortExpression 获得当前排序表达式;
UseAccessibleHeader 规定是否为列标题生成<th>标签(而不能<td>标签)。
GridView控件的模板属性:
EmptyDataTemplate 指示该控件绑定到一个空的数据源时要生成的模板内容。如果该属性和EmptyDataText属性都设置了,则该属性优先采用。如果两个属性都没有设置,则把该网格控件绑定到一个空的数据源时不生成该网格;
PagerTemplate 指示要为分页器生成的模板内容。该属性覆盖我们可能通过PagerSettings属性作出的任何设置。
GridView控件的状态属性:
BottomPagerRow 返回表示该网格控件的底部分页器的GridViewRow对象;
Columns 获得一个表示该网格中的列的对象的集合。如果这些列是自动生成的,则该集合总是空的;
DataKeyNames? 获得一个包含当前显示项的主键字段的名称的数组;
DataKey 获得一个表示在DataKeyNames中为当前显示的记录设置的主键字段的值;
EditIndex 获得和设置基于0的索引,标识当前以编辑模式生成的行;
FooterRow返回一个表示页脚的GridViewRow对象;
HeaderRow返回一个表示标题的GridViewRow对象;
PageCount 获得显示数据源的记录所需的页面数;
PageIndex 获得或设置基于0的索引,标识当前显示的数据页;
PageSize指示在一个页面上要显示的记录数;
Rows 获得一个表示该控件中当前显示的数据行的GridViewRow对象集合;
SelectedDataKey 返回当前选中的记录的DataKey对象;
SelectedIndex获得和设置标识当前选中行的基于0的索引;
SelectedRow返回一个表示当前选中行的GridViewRow对象;
SelectedValue返回DataKey对象中存储的键的显式值。类似于SelectedDataKey;
TopPagerRow返回一个表示网格的顶部分页器的GridViewRow对象。
GridView 控件激发的事件:
PageIndexChanging , PageIndexChanged 这两个事件都是在其中一个分页器按钮被单击时发生。它们分别在网格控件处理分页操作之前和之后激发;
RowCancelingEdit 在一个处于编辑模式的行的Cancel按钮被单击,但是在该行退出编辑模式之前发生;
RowCommand 单击一个按钮时发生;
RowCreated 创建一行时发生;
RowDataBound 一个数据行绑定到数据时发生;
RowDeleting,RowDeleted 这两个事件都是在一行的Delete按钮被单击时发生。它们分别在该网格控件删除该行之前和之后激发;
RowEditing 当一行的Edit按钮被单击时,但是在该控件进入编辑模式之前发生;
RowUpdating,RowUpdated这两个事件都是在一行的Update按钮被单击时发生。它们分别在该网格控件更新该行之前和之后激发;
SelectedIndexChanging,SelectedIndexChanged 这两个事件都是在一行的Select按钮被单击时发生。它们分别在该网格控件处理选择操作之前和之后激发;
Sorting,Sorted 这两个事件都是在对一个列进行排序的超链接被单击时发生,它们分别在网格控件处理排序操作之前和之后 激发。
GridView绑定
对列进行配置:如下代码把一个数据绑定的列添加到网格中:
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="companyname" HeaderText="产品名称" />
</Columns>
<EmptyDataTemplate>
</EmptyDataTemplate>
</asp:GridView>
GridView中的绑定列,这些列字段类都继承DataControlField:
BoundField 默认的列类型。作为纯文本显示一个字段的值;
ButtonField作为命令显示一个字段的值。我们可以选择链接按钮或按钮开关样式;
CheckBoxField作为一个复选框显示一个字段的值,它通常用来生成布尔值;
CommandField 是ButtonField的增强版本,表示一个特殊的命令,诸如Select、Delete、Insert或Update.该属性对GridView控件几乎没什么用;该字段是为DetailsView控件定制的;
HyperLinkField作为超链接显示一个字段的值。单击该超链接时,浏览器导航到指定的URL;
ImageField 作为一个<img>HTML标签的Src属性显示一个字段的值,绑定字段的内容应该是物理图像的URL;
TemplateField 为列中的每一项显示用户定义的内容。
GridView列的公共属性,代表每个列类型实际提供的属性的一个子集;
AccessibleHeaderText 表示Assistive Technology设备的屏幕阅读器读取的缩写文本的文本;
FooterStyle获得该列的页脚的样式对象;
FooterText获得和设置该列的页脚的文本;
HeaderImageUrl获得和设置放在该列的标题中的图像的URL;
HeaderStyle获得该列的标题的样式对象;
HeaderText获得和设置该列的标题的文本;
InsertVisible指示当它的父数据绑定控件处于插入模式时,该字段是否可见;
ItemStyle获得各列的单元的样式对象;
ShowHeader指示是否生成该列的标题;
SortExpression获得和设置该列的标题被单击时用来排序网格的表达式;
绑定字段
BoundField类表示在一个数据绑定控件(诸如GridView 或DetailsView)中作为纯文本显示的一个字段。为了规定要显示的字段,把DataField属性设置为该字段的名称,要在头部或页脚部分显示一个标题,请分别设置HeaderText和FooterText属性;
按钮字段
按钮字段表示我们希望通过一个服务器端事件处理的任何操作,当该按钮被单击时,页面回发并激发一个RowCommand事件。
超链接字段
超链接列把用户指向一个不同的URL,该URL可以有选择地在一个内部框架中显示出来。
如:
<asp:HyperLinkField ID="HyperLinkField1" runat="server"
DataNavigateUrlFields="id" DataNavigateUrlFormatString="Flower.aspx?id={0}"
DataTextField="name" HeaderText="鲜花" />
当用户单击该按钮时,浏览器用Flower.aspx?id=XXX将鲜花id传出
CheckBox字段
CheckBoxField列是显示一个复选框的一个较简单的绑定列.
图像字段
ImageField列类型表示一个在数据绑定控件中作为图像显示的字段。
模板字段
有时候我们需要一些特殊格式的绑定字段,是定制列。这可以通过使用模板得到的结果。
TemplateField列为该网格中的每一行提供一个个性化用户界面,这完全是由页面开发人员定义的,我们可以为名生成阶段定义模板,包括默认视图、原地编辑、标题和页脚。
GridView控件支持的模板
AlternatingItemTemplate定义交替行的内容和外观,如果没有规定模板,则使用ItemTemplate;
EditItemTemplate定义当前正在编辑的行的内容和外观。该模板包含输入字段,而且还可能包含验证程序;
FooterTemplate定义该行的页脚的内容和外观;
HeaderTemplate定义该行的标题的内容和外观;
ItemTemplate定义该行的默认内容和外观。
一个模板化视图可以包含对我们正在创建的应用程序有意义的东西:服务器控件、文字和数据绑定表达式。
数据绑定表达式允许我们插入当前数据行中包含的值,然而,并非所有的模板都支持数据绑定表达式。
如下代码说明了如何为一个产品定义项目模板。该列显示在现行上,并包括产品的名称和一些有关产品包装的信息。
<asp:TemplateField>
<ItemTemplate>
<%# Eval("productName") %><br/>
available in<%# Eval("quantityperunit") %>
</ItemTemplate>
</asp:TemplateField>
数据绑定语法
ASP.NET中,有如下两种数据绑定语法:
1、使用Eval方法
可计算数据绑定控件的模板中后期绑定数据表达式。Eval方法以数据字段的名称作为参数
Eval方法可诸数据绑定控件的模板中的后期绑定数据表达式。在运行时,Eval方法调用DataBinder对象的Eval方法,同时引用命名容器的当前数据项。命名容器通常是包含完整记录的数据绑定控件的最小组成部分,如GridView控件中的一行。
Eval方法以数据字段的名称作为参数,从事数据源的当前记录返回一个包含该字段值的字符串。字符串格式参数使用String类的Format方法定义的语法。
Eval是只读的方法论(定向数据绑定),绑定的内容为不会提交回服务器。比如用户名,并不想让用户做任何修改,可以使用:
<%# Eval("UserName").ToString.Trim() %>
Eval还有一个重载的方法,可以实现格式化。比如需要用户的注册时间,可以使用:
<%# Eval("RegTime","{0:dd/MM/yyyy}") %>
其中0代表对应的PublishDate字段,而dd/MM/yyyy指明了最终显示文本的格式,它可能会显示为17/07/2009.
2、使用Bind方法
Bind方法与Eval方法有一些相似之处,但也存在很大的差异。虽然可以像使用Eval方法一样使用Bind方法来检索数据绑定字段的值,但当数据可以被修改是地,还是要使用Bind方法。
Bind方法通常与输入控件一起使用,例如由编辑模式中的GridView行所呈现的TextBox控件。当数据绑定控件将这些输入控件作为自身呈现的一部分创建时,该方法便可提取输入值。
Bind方法支持读/写功能(双向数据绑定),该方法常常与输入控件(比如TextBox控件)一起使用,达到可更新数据的目的。比如图书的标题可以修改,可以设置为:
<%# Bind("Title") %>
GridView深入
1、高亮显示
当我们的鼠标移动到GridView的某一行时,该行加亮显示,代码如下 :
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) //判断是否为数据行,即排除表头和尾
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes.Add("onmouseover", "currentcolor=this.style.backgroundColor;this.style.backgroundColor='yellow',this.style.fontWeight='bold'");
e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=currentcolor,this.style.fontWeight=''");
}
}
如果需要高亮显示的不是整行,而是某个单元格,也可以使用该方法,比如我们要高亮显示价格是"199.00"的单元格,代码为:
if (((flower.Models.Product)e.Row.DataItem).Price.Trim() == "199.00")
{
e.Row.Cells[3].BackColor = System.Drawing.Color.Yellow;
}
2、删除提示
我们在做删除操作的时候,都会需要一个提示,当用户确认后才进行删除操作,对于这种情况,我们一般采用模板列进行处理。代码如下:
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="javascript:return confirm('记录一旦删除不可恢复,确认要删除吗?')" CausesValidation="false" CommandName="Delete" Text="删除"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
3、GridView结合复选框的全选效果
有时候,我们需要删除多条记录,为方便用户使用,我们不希望每条记录删除一次,而希望有一个复选框,可以一次删除多条记录,而不是一次次的点删除确认。这时,可以使用复选框来实现多选的效果。
首先,创建模板列,并在其中放置CheckBox控件,编写客户端脚本,代码如下:
<script language="javascript">
function GetAllCheckBox(CheckAll)
{
var items = document.getElementsByTagName("input");
for(var i = 0;i < items.length;i++)
{
if(items[i].type == "checkbox")
{
items[i].checked = CheckAll.checked;
}
}
}
</script>
另外,还需要在“全选”前面的复选框上添加Onclick="GetAllCheckBox(this)"事件,GridView代码如下:
<asp:TemplateField>
<HeaderTemplate>
<input id="cbAll" type="checkbox" onclick="GetAllCheckBox(this)" />全选
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" />
</ItemTemplate>
</asp:TemplateField>
4、固定表头
固定表头,是在下拉表格的情况下,表头跟随下移,使得表头相对用户和浏览器而言是在固定位置,可以使用户随时看清楚字段对应的内容。创建浮动样式代码如下:
<style type="text/css">
.Freezing
{
position:relative;
table-layout:fixed;
top:expression(this.offsetParent.scrollTop);
z-index:10;
}
.Freezing th
{
text-overflow:ellipsis;
overflow:hidden;
white-space:nowrap;
padding:2px;
}
</style>
还需将GridView中HeaderSytle的CssClass值设为Freezing
5、显示隐藏某一列
有时候,结果中的列太多也是一个烦恼,为了适应不同用户的需求,可能需要用户自己设置是否显示某些行。
现在要隐藏ID,编写代码如下:
<asp:CheckBox ID="cbID" runat="server" AutoPostBack="true" Text="隐藏ID"
oncheckedchanged="cbID_CheckedChanged" />
事件代码为:
protected void cbID_CheckedChanged(object sender, EventArgs e)
{
GridView1.Columns[2].Visible = !GridView1.Columns[2].Visible;
Response.Write("ID列现在的显示隐藏状态是:"+GridView1.Columns[2].Visible.ToString());
}