DataGrid控件的显著特征是Columns和Items集合属性及样式和数据绑定属性。Items属性返回DataGridItem对象的集合,每个元素对应显示出来的行。DataGridItem类是TableRow类的子类,对其进行了细化。
DataGird控件的输出由几种元素组成:Header(标头)、Item(显示项)、Alternating Item(交替显示项)、Footer(页脚)、Pager(导航栏)。
DataKeyField属性提供了底层数据源的主键字段,DataKeys集合属性提供了各行的主键值。DataKeys集合会基于DataKeyField属性值和绑定数据源自动填充。
CancelCommand和UpdateCommand事件只有在某项处于编辑状态时发会被触发。CancelCommand事件对应于用户单击“取消”按钮所发出的事件通知。UpdateCommand事件对应于用户保存所有更改所发出的事件通知。
DataGrid控件由可进行数据绑定的列构成,默认情况下,该控件的视图中包含数据源中的所有字段。若需要自动绑定数据,将AutoGenerateColumns属性设为false即可。在这种情况下,只显示在Columns集合中被显式设置的列。DataGrid支持多种类型的列,主要区别在于呈现数据的形式。若手动向Columns集合中添加列,则需指定其类型。若开启自动生成列功能,那么所有列都将为BoundColumn类型。下表中列出了DataGrid支持的所有列类型:
注意,AutoGenerateColumns属性与Columns集合不是互斥的,如果前者设置为true,且集合不为空,网格控件先会显示所有自动生成的列,再在后面追加用户定义的列。
示例:
...
<columns>
<asp:BoundColumn runat="server" DataField="employeeid" HeaderText="ID" />
<asp:BoundColumn runat="server" DataField="firstname" HeaderText="First Name" />
<asp:BoundColumn runat="server" DataField="lastname" HeaderText="Last Name" />
</columns>
</asp:datagrid>
列在集合中的顺序决定了DataGrid控件中列的显示顺序。
我们也可以编码的方式将列添加到DataGrid控件中:
bc.DataField = " firstname " ;
bc.HeaderText = " First Name " ;
grid.Columns.Add(bc);
DataGrid不会将Columns集合的内容保存到视图状态中,因而在刚被回发时它始终为空。为“保存”动态添加的列,我们需要在每次回发后重新将这种列添加到控件中。
数据绑定列
所有类型的网格列都继承于DataGridColumn类,这些类型有一些共有的属性:
设置网格列的关键属性是DataField和DataFormatString。前者用于指定绑定的列名称,后者用于设置文本的显示格式。仅当被编辑命令列被添加到网格中时,ReadOnly属性才会发挥作用。该属性决定当前列的单元格是否能切换到编辑模式。
下面的代码插入到两个列,并分别指定标头的文本和源字段。此外,还为第二个列指定了一个格式字符串,使其以货币格式呈现,并将文本设为右对齐:
< asp:boundcolumn runat ="server" datafield ="unitprice" headertext ="Price" DataFormatString ="{0:c}" >
< itemstyle width ="80px" horizontalaigh ="right" />
</ asp:boundcolumn >
列的外观必须通过子样式元素来指定。
超链接列(HyperLink Column)
在HyperLinkColumn类代表的列中,每个单元格包含一个超链接。DataTextField接受用于设置超链接文本的字段的名称,DataNavigateUrlField接受URL信息的字段的名称。还有一个叫DataNavigateUrlFormatString的属性,用于定义URL的最终格式。示例:
headertext ="product"
datanavigateurlfield ="productid"
datanavigateurlformatstring ="productinfo.aspx?id={0}"
target ="ProductView" >
< itemstyle width ="200px" />
</ asp:hyperlinkcolumn >
所有链接都指向同一个页面--productinfo.aspx,但每个链接带有产品ID。
通过DataNavigateUrlField和DataNavigateUrlFormatString属性,我们可以使超链接的URL带有参数。然而,在默认情况下,其中只能包含一个参数,即绑定到DataNavigateUrlField属性的值。要将链接绑定到多个参数上,我们需要使用模板列,或使用GridView控件。
按钮列
ButtonColumn类代表按钮列。按钮列与超链接列不同之处在于:所有按钮都回发到同一URL。
按钮列主要用于用户单击某一行按钮后,执行特定的操作。这种列中所有按钮都会与一段用于回发的脚本代码关联,回发后会执行服务器端的ItemCommand过程。该过程中,我们可以使用命令的名称(CommandName)来区分来自不同列按钮的单击,并通过DataGridItem类的ItemIndex属性获取被单击行的索引。DataGridItem对象的引用会被传到ItemCommand事件中。
“选择列”是一种特殊的按钮列,命令名为select。当单击这样的列后,DataGrid会自动用一种不同的样式设置来绘制被选定的行,这些设置由SelectedItemStyle属性指定。
选定行的样式由SelectedItemStyle设置:
SelectedIndexChanged事件会对选定项的变更进行通知。然而,在该事件被引发前,应用程序可处理相关的ItemCommand事件。当程序执行到SelectedIndexChanged时,可通过SelectedIndex属性获取新选定行的索引。
模板列
模板列允许我们使用HTML文本和服务器控件来设置这种列单元格的布局。模板列中的控件可以绑定到数据源的任意多个字段上。具体来说,我们可以在一个表达式中绑定多个字段,甚至还可用HTML属性来修饰其中的标签。模板列是自定义的,不能出现在自动生成的列中。如果要使多列共享同一个模板,我们只能在ASP.NET页面中复制代码。
模板列用<TemplateColumn>标签标记,最终由TemplateColumn呈现。该标签的主体部分可包含4种不同的模板:ItemTemplate、EditItemTemplate、HeaderTemplate、FooterTemplate。模板列不会自动绑定到数据源字段,若要将模板列绑定到若干数据字段上,需要使用数据绑定表达式。具体来说,我们可使用Eval方法在运行时对数据绑定表达式进行计算,返回的值会自动进行类型转换。示例:
< itemtemplate >
< asp:label runat ="server" Text ='<%# DataBinder.Eval(Container.DataItem, "lastname") % > ' />
</ itemtemplate >
</ asp:templatecolumn >
DataGrid控件的使用
DataGrid与宿主页面间的交互仅限于以回发事件的形式进行通知。DataGrid会通知页面发生的事件,其余的操作由页面来决定。
分页
如果当前页面的索引被更改,该控件会向应用程序引发PageIndexChanged事件。如下所示:
{
grid.CurrentPageIndex = e.NewPageIndex;
// 必须重置数据源以强制更新控件
grid.DataSourceID = " SqlDataSource1 " ;
}
注意,我们要重新对DataSourceID进行赋值,以便触发内部的数据源更改事件,使该控件加载新的数据集。
DataGrid控件还支持自定义的分页,只将适合于当前面显示的记录绑定到控件上:
{
grid.CurrentPageIndex = e.NewPageIndex;
grid.DataSource = GetRecordsInPage(grid.CurrentPageIndex);
}
protected object GetRecordsInPage( int pageIndex)
{
// 获取指定页的数据
...
}
数据排序
DataGrid控件的AllowSorting属性用于启用列的排序功能。启用该功能后,必须处理SortCommand事件处理程序,否则不会有任何效果。示例:
{
SqlDataSource1.SelectCommand += " Order by " + e.SortExpresstion;
grid.DataSourceID = " SqlDataSource1 " ;
}
现有记录的编辑
就地编辑所涉及的关键对象是EditCommandColumn。这种列会将特殊的链接添加到网格的所有行中,其中某个链接被单击后,宿主页面会回发,相应的行会以编辑模式绘制。
为完成DataGrid的就在编辑操作,必须编写三个事件处理程序:通过EditCommand事件将网格切换的编辑模式,通过CancelCommand将网格切换回只读模式,通过UpdateCommand保存更新并刷新网格内容。