第8章 详解GridView控件

如果你知道。NET Framework 1.0版中的DataGrid控件,那么相信你很快就会喜欢上使用GridView控件。GridView控件是DataGrid的新一代接班人,是基于DataGrid成功经验与缺点改良的。它不但具备了更强大的数据网格显示与统计等功能,而且还可以以更少或者零程序代码来完成简单的数据处理,如选择、排序、分页、编辑与数据统计等。此外,它还可以很方便地通过模板进行扩展,从而满足你的各种显示要求。在日常的Web设计中,GridView控件是使用最为频繁的Web控件,尤其是数据处理方面的程序。

8.1 GridView控件基础

GridView控件是一个用于显示数据的极为灵活的网络控件。在实际编程中,可以通过多种方式来对GridView控件进行数据绑定,还可以根据程序的需要来自定义它的列类型。

8.1.1 数据绑定

与ASP.NET的其他数据控件一样,GridView控件可以绑定到数据源控件(如SqlDataSource、ObjectDataSource等),以及实现System.Collections.IEnumerable接口的任何数据源(如System.Data.DataView、System.Collections.ArrayList或System.Collections.Hashtable)。可以使用以下方法之一将GridView控件绑定到适当的数据源类型:

1)若要绑定到某个数据源控件,请将GridView控件的DataSourceID属性设置为该数据源控件的ID值。GridView控件将会自动绑定到指定的数据源控件,并且可利用该数据源控件的功能来执行排序、更新、删除和分页功能,从而无须编写任何额外的代码。如下面的示例所示:


<asp:SqlDataSource ID="SqlDataSource1"runat="server"

ConnectionString="<%$ConnectionStrings:ConnectString%>"

SelectCommand="SELECT*FROM[Employee]"></asp:SqlDataSource>

<asp:GridView ID="GridView1"runat="server"

AutoGenerateColumns="true"

DataSourceID="SqlDataSource1">

</asp:GridView>


2)若要绑定到某个实现System.Collections.IEnumerable接口的数据源,可以以编程方式将GridView控件的DataSource属性设置为该数据源,然后调用DataBind()方法。当使用此方法时,GridView控件不提供内置的排序、更新、删除和分页功能。因此,需要使用适当的事件处理程序来提供此功能。如下面的示例所示:


<asp:GridView ID="GridView1"runat="server"

AutoGenerateColumns="true">

</asp:GridView>


下面就可以给这个GridView控件在后台代码里绑定一个DataTable,当然也可以是DataSet或者List等。如下面的代码所示:


protected void Page_Load(object sender, EventArgs e)

{

if(!IsPostBack)

{

Bind();

}

}

private void Bind()

{

GridView1.DataSource=

DbHelper.Instance.CreateDataTable(CommandType.Text,

"select*from employee");

GridView1.DataBind();

}


8.1.2 定义列

到现在为止,你所看到的GridView控件示例都是把AutoGenerateColumns属性设置为true。采用这样的设置时,GridView会使用反射来检查数据对象并找到所有字段(记录)或者属性(自定义对象),然后它会按照发现的次序为它们逐一创建列。

当然,这种自动生成列的功能对于快速创建页面非常有效,但它却缺少灵活性。如果希望隐藏某些列,或者改变它们的显示顺序,又或者希望自定义显示某些方面,例如,希望用自定义的标题文字来代替原始字段名显示,等等,在这些情况下,这种自动生成列的功能将不能够满足要求。这时,就必须采用自定义列的方式来定义GridView控件,而将自动生成列的功能关闭,即将AutoGenerateColumns属性设置为false。

通过将AutoGenerateColumns属性设置为false,然后定义自己的列字段集合,也可以手动控制哪些列字段将显示在GridView控件中。不同的列字段类型决定控件中各列的行为。表8-1列出了可以使用的不同列字段类型。

figure_0305_0211

若要以声明方式定义列字段集合,首先必须在GridView控件的开始和结束标记之间添加<Columns>开始和</Columns>结束标记。接着,列出想包含在<Columns>开始和</Columns>结束标记之间的列字段。指定的列将以所列出的顺序添加到Columns集合中。Columns集合存储该控件中的所有列字段,并允许以编程方式管理GridView控件中的列字段。

值得注意的是,显式声明的列字段可与自动生成的列字段结合在一起显示。两者同时使用时,先呈现显式声明的列字段,再呈现自动生成的列字段。

在表8-1所示的GridView控件的列字段类型中,最基本的列类型是BoundField,它绑定到数据对象的某个字段上。如下面是一个显示employeeid字段的数据绑定列的定义:


<asp:BoundField DataField="employeeid"HeaderText="编号"/>


这样标题的文字就由“employeeid”变成了“编号”。下面展示了一个完整的GridView控件自定义列的示例。


<asp:GridView ID="GridView1"runat="server"

AutoGenerateColumns="False">

<Columns>

<asp:BoundField DataField="employeeid"HeaderText="编号"/>

<asp:BoundField DataField="employeename"HeaderText="姓名"/>

<asp:BoundField DataField="department"HeaderText="部门"/>

<asp:BoundField DataField="address"HeaderText="地址"/>

<asp:BoundField DataField="email"HeaderText="邮箱"/>

</Columns>

</asp:GridView>


示例运行结果如图8-1所示。

figure_0306_0212

图 8-1 GridView控件示例运行结果

另外,除了可以为BoundField列设置DataField和HeaderText属性之外,还可以设置其他的属性,如表8-2所示。

figure_0306_0213

figure_0307_0214

除了可以像上面那样手动配置GridView控件的列之外,还可以使用Visual Studio的配置工具来配置GridView控件的列与相关列属性。其方法如下:

1)打开GridView Tasks,如图8-2所示。

2)在“GridView Tasks”中单击“Edit Columns”链接菜单,打开“Fields”窗体,如图8-3所示,可以在这里配置GridView控件列,并设置相关的列属性。

figure_0307_0215

图 8-2 GridView Tasks

figure_0307_0216

图 8-3 “Fields”窗体