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,且集合不为空,网格控件先会显示所有自动生成的列,再在后面追加用户定义的列。

  示例:

<asp:datagrid runat="server" id="grid" ...>
...
<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控件中:

BoundColumn bc = new BoundColumn();
bc.DataField
= "firstname";
bc.HeaderText
= "First Name";
grid.Columns.Add(bc);

  DataGrid不会将Columns集合的内容保存到视图状态中,因而在刚被回发时它始终为空。为“保存”动态添加的列,我们需要在每次回发后重新将这种列添加到控件中。

数据绑定列

  所有类型的网格列都继承于DataGridColumn类,这些类型有一些共有的属性:

  设置网格列的关键属性是DataField和DataFormatString。前者用于指定绑定的列名称,后者用于设置文本的显示格式。仅当被编辑命令列被添加到网格中时,ReadOnly属性才会发挥作用。该属性决定当前列的单元格是否能切换到编辑模式。

  下面的代码插入到两个列,并分别指定标头的文本和源字段。此外,还为第二个列指定了一个格式字符串,使其以货币格式呈现,并将文本设为右对齐:

<asp:boundcolumn runat="server" datafield="quantityperunit" headertext="Packaging" />
<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的最终格式。示例:

<asp:hyperlinkcolumn runat="server" datatextfield="productname"
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属性指定。

<asp:ButtonColumn runat="server" text="select" CommandName="Select" />

  选定行的样式由SelectedItemStyle设置:

<selecteditemstyle backcolor="cyan" />

  SelectedIndexChanged事件会对选定项的变更进行通知。然而,在该事件被引发前,应用程序可处理相关的ItemCommand事件。当程序执行到SelectedIndexChanged时,可通过SelectedIndex属性获取新选定行的索引。

模板列

  模板列允许我们使用HTML文本和服务器控件来设置这种列单元格的布局。模板列中的控件可以绑定到数据源的任意多个字段上。具体来说,我们可以在一个表达式中绑定多个字段,甚至还可用HTML属性来修饰其中的标签。模板列是自定义的,不能出现在自动生成的列中。如果要使多列共享同一个模板,我们只能在ASP.NET页面中复制代码。

  模板列用<TemplateColumn>标签标记,最终由TemplateColumn呈现。该标签的主体部分可包含4种不同的模板:ItemTemplate、EditItemTemplate、HeaderTemplate、FooterTemplate。模板列不会自动绑定到数据源字段,若要将模板列绑定到若干数据字段上,需要使用数据绑定表达式。具体来说,我们可使用Eval方法在运行时对数据绑定表达式进行计算,返回的值会自动进行类型转换。示例:

<asp:templatecolumn runat="server" headertext="Last Name">
<itemtemplate>
<asp:label runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "lastname") %>' />
</itemtemplate>
</asp:templatecolumn>

DataGrid控件的使用

  DataGrid与宿主页面间的交互仅限于以回发事件的形式进行通知。DataGrid会通知页面发生的事件,其余的操作由页面来决定。

分页

  如果当前页面的索引被更改,该控件会向应用程序引发PageIndexChanged事件。如下所示:

protected void grid_PageIndexChanged(object sender, DataGridPageChangedEventArgs e)
{
grid.CurrentPageIndex
= e.NewPageIndex;
//必须重置数据源以强制更新控件
grid.DataSourceID = "SqlDataSource1";
}

  注意,我们要重新对DataSourceID进行赋值,以便触发内部的数据源更改事件,使该控件加载新的数据集。

  DataGrid控件还支持自定义的分页,只将适合于当前面显示的记录绑定到控件上:

protected void grid_PageIndexChanged(object sender, DataGridPageChangedEventArgs e)
{
grid.CurrentPageIndex
= e.NewPageIndex;
grid.DataSource
= GetRecordsInPage(grid.CurrentPageIndex);
}

protected object GetRecordsInPage(int pageIndex)
{
//获取指定页的数据
...
}

数据排序

  DataGrid控件的AllowSorting属性用于启用列的排序功能。启用该功能后,必须处理SortCommand事件处理程序,否则不会有任何效果。示例:

protected void grid_SortCommand(object sender, DataGridSortCommandEventArgs e)
{
SqlDataSource1.SelectCommand
+= " Order by " + e.SortExpresstion;
grid.DataSourceID
= "SqlDataSource1";
}

现有记录的编辑

  就地编辑所涉及的关键对象是EditCommandColumn。这种列会将特殊的链接添加到网格的所有行中,其中某个链接被单击后,宿主页面会回发,相应的行会以编辑模式绘制。

  为完成DataGrid的就在编辑操作,必须编写三个事件处理程序:通过EditCommand事件将网格切换的编辑模式,通过CancelCommand将网格切换回只读模式,通过UpdateCommand保存更新并刷新网格内容。

posted on 2011-04-20 23:10  辛勤的代码工  阅读(1701)  评论(0编辑  收藏  举报