备注
DataGrid 控件将数据源地字段显示为表中的列。DataGrid 控件中的每一行表示数据源中的一个记录。DataGrid 控件支持选择、编辑、删除、分页和排序。默认情况下,AutoGenerateColumns 属性设置为 true,这将为数据源中的每一个字段创建一个 BoundColumn 对象。然后,每一个字段按照在数据源中出现的顺序在 DataGrid 控件中呈现为一个列。还可以通过将 AutoGenerateColumns 属性设置为 false,然后列出希望包含在开始和结束 <Columns> 标记之间的列来手动控制在 DataGrid 控件中显示的列。指定的列按列出的顺序添加到 Columns 集合中。这使您可以通过编程方式控制 DataGrid 控件中的列。注意 列在 DataGrid 控件中显示的顺序由这些列在 Columns 集合中出现的顺序控制。尽管可以通过操作 Columns 集合以编程方式更改列的顺序,但按所需的显示顺序列出这些列会更为容易。
注意 显式声明的列可与自动生成的列一起使用。当同时使用这二者时,首先呈现的是显式声明的列,其后是自动生成的列。自动生成的列不会添加到 Columns 集合中。
不同的列类型确定控件中列的行为。DataGrid 控件允许您使用以下列类型:列类型 说明 
EditCommandColumn 将最常用的编辑命令(“编辑”、“更新”、“取消”)封装在预定义的列类型中。 
HyperLinkColumn 创建一个列,该列具有一组绑定到数据字段值的超级链接。例如,一个显示订单列表的网格可以包含一个超级链接列,OrderID 字段在该列中呈现为一个指向显示该订单详细信息的页的超级链接。 
BoundColumn 创建一个列,该列绑定到数据源中的一个字段并使用样式呈现在表单元格中。这是 DataGrid 控件的默认列类型。 
ButtonColumn 创建一个列,该列针对列中的每一项包含一个用户定义的命令按钮(如“添加”或“移除”)。 
TemplateColumn 创建一个列,该列允许您使用自定义 HTML 元素和控件的模板定义控件的布局。 下表提供有关可以为 DataGrid 控件声明的列的信息。DataGridColumn 基本属性
以下属性是所有 DataGrid 列类型都具有的属性。属性 说明 
FooterText 显示在列的下边缘的文本。 
HeaderImageUrl 代替列标头中的 HeaderText 文本而呈现的图像的 URL。 
HeaderText 显示在列的上边缘的文本。 
Owner 一个对绑定列所属的 DataGrid 控件的引用(只读)。 
该属性仅在编程时使用。
 
SortExpression 当用户指定按该列的内容进行排序时,对数据源进行排序时所依据的字段的名称。 
Visible 如果显示该列,则为 true;否则为 false。 BoundColumn 属性
属性 说明 
DataField DataSource 中作为该列的数据源的对象的字段或属性。 
DataFormatString 指定字段在单元格中如何显示的格式设置表达式字符串。它类似于由 String.Format 方法使用的格式设置表达式。 
ReadOnly 如果将行置于编辑模式时无法编辑列,则为 true;否则为 false。 ButtonColumn 属性
属性 说明 
ButtonType 要呈现的按钮的类型。默认为 LinkButton。 
编程时,使用 ButtonColumnType 枚举设置此属性。
 
CommandName 一个字符串,它指示在单击列中的某个按钮时发送的命令。此字符串可通过 e 事件参数对象的 CommandSource 属性用于事件处理方法中。 
DataGrid 控件识别某些标准命令名。这些命令名包括“选择”、“排序”、“更新”、“取消”、“编辑”、“删除”和“分页”。
 
DataTextField DataSource 中绑定到 ButtonColumn 中按钮的 Text 属性的字段名。 
DataTextFormatString 指定字段在单元格中如何显示的格式设置表达式字符串。 
Text 在此列中的按钮表面上显示的标题。如果设置了 DataTextField,则它将重写此值。 TemplateColumn 属性
属性 说明 
EditItemTemplate 当列处于编辑模式时定义该列的 HTML 元素和控件。 
FooterTemplate 定义列脚注的 HTML 元素和控件。 
HeaderTemplate 定义列标头的 HTML 元素和控件。 
ItemTemplate 在显示列时定义该列的 HTML 元素和控件。 HyperLinkColumn 属性
属性 说明 
DataNavigateUrlField DataSource 中对象的字段或属性,它提供要移动到的页的 URL。 
DataNavigateUrlFormatString 用于 Text 属性的格式表达式。 
DataTextField DataSource 中的对象的字段或属性,它是列的 Text 属性的数据源。 
DataTextFormatString 格式设置字符串,它指定 Text 属性在控件中的显示方式。 
NavigateUrl 要移动到的页的 URL。如果设置了 DataNavigateUrlField,则它将重写此属性。 
Target 用于显示页的目标窗口。它可以是窗口或框架引用的名称,如 _TOP。 
Text 超级链接的文本。 EditCommandColumn 属性
属性 说明 
ButtonType 要呈现的按钮的类型。默认为 LinkButton。 
编程时,使用 ButtonColumnType 枚举设置此属性。
 
EditText 在“编辑”按钮的表面上显示的字符串。 
UpdateText 在“更新”按钮的表面上显示的字符串。 
CancelText 在“取消”按钮的表面上显示的字符串。 通过设置 DataGrid 控件的不同部分的样式属性,可以自定义该控件的外观。下表列出 DataGrid 控件的不同部分的样式属性。样式属性
样式属性 说明 样式类 
AlternatingItemStyle 隔项(交替项)的样式。 TableItemStyle 
EditItemStyle 正在编辑的项的样式。 TableItemStyle 
FooterStyle 列表结尾处的脚注(如果有的话)的样式。 TableItemStyle 
HeaderStyle 列表开始处的标头(如果有的话)的样式。 TableItemStyle 
ItemStyle 单个项的样式。 Style 
PagerStyle 页选择控件的样式。 DataGridPagerStyle 
SelectedItemStyle 当前选定项的样式。 TableItemStyle 有关每个样式类支持的属性的信息,请参阅样式对象属性。DataGrid 控件包含以页段为单位显示其内容的内置功能。页上的项数由 PageSize 属性确定。如果没有为 PageSize 属性指定任何值,则 DataGrid 控件在该页上一次显示十个项。默认情况下,禁用分页。若要启用分页,请将 AllowPaging 属性设置为 true 并提供处理 PageIndexChanged 事件的代码。PageIndexChanged 事件的典型逻辑是将 CurrentPageIndex 属性设置为要显示页的索引,然后将数据源重新绑定到该控件。要显示的页的索引通常是通过传递给事件处理程序的 DataGridPageChangedEventArgs 对象的 NewPageIndex 属性来访问的。对于标准分页,DataGrid 控件假定数据源包含所有要显示的项。DataGrid 控件根据页索引(由 CurrentPageIndex 属性指定)以及该页上的项数(由 PageSize 属性指定)计算当前页上的项的索引。还可通过编程方式向由 DataGrid 控件生成的 <td> 和 <tr> 标记添加属性来进一步自定义 DataGrid 控件的外观。通过为 ItemCreated 或 ItemDataBound 事件提供自定义事件处理程序,可将属性插入到标记中。通常情况下,属性被添加到 ItemCreated 事件的事件处理程序中。但如果属性依赖于实际数据,则将属性添加到 ItemDataBound 事件的处理程序中。若要将属性添加到 <td> 标记,首先获取表示要向其添加该特性的 DataGrid 控件中单元格的 TableCell 对象。可使用传递到事件处理程序中的 DataGridItemEventArgs 的 Item 属性(DataGridItemEventArgs 索引器)的 Control.Controls 集合获取所需的 TableCell。然后,可使用 TableCell 的 Attributes 集合的 AttributeCollection.Add 方法将属性添加到 <td> 标记。若要将属性添加到 <tr> 标记,首先获取表示要向其添加该属性的 DataGrid 控件中的行的 DataGridItem。可使用传递到事件处理程序中的 DataGridItemEventArgs 的 Item 属性(DataGridItemEventArgs 索引器)获取所需的 DataGridItem。然后,可使用 DataGridItem 的 Attributes 集合的 AttributeCollection.Add 方法将属性添加到 <tr> 标记。有关 DataGrid Web 服务器控件的属性和事件的详细信息,请参阅 DataGrid 类文档。示例
下面的示例说明如何使用 DataGrid 控件显示数据源中的项。[Visual Basic]
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
 
<html>
   <script runat="server">      Function CreateDataSource() As ICollection         Dim dt As New DataTable()
         Dim dr As DataRow
         Dim i As Integer
        
         dt.Columns.Add(New DataColumn("IntegerValue", GetType(Int32)))
         dt.Columns.Add(New DataColumn("StringValue", GetType(String)))
         dt.Columns.Add(New DataColumn("CurrencyValue", GetType(Double)))
        
         For i = 0 To 8
            dr = dt.NewRow()
            
            dr(0) = i
            dr(1) = "Item " + i.ToString()
            dr(2) = 1.23 *(i + 1)
            
            dt.Rows.Add(dr)
         Next i
        
         Dim dv As New DataView(dt)
         Return dv      End Function 'CreateDataSource      Sub Page_Load(sender As Object, e As EventArgs)
        
         If Not IsPostBack Then
            ' Need to load this data only once.
            ItemsGrid.DataSource = CreateDataSource()
            ItemsGrid.DataBind()
         End If      End Sub 'Page_Load
 
   </script>
 
<body>
 
   <form runat="server">
 
      <h3>DataGrid Example</h3>
 
      <b>Product List</b>
 
      <asp:DataGrid id="ItemsGrid"
           BorderColor="black"
           BorderWidth="1"
           CellPadding="3"
           AutoGenerateColumns="true"
           runat="server">         <HeaderStyle BackColor="#00aaaa">
         </HeaderStyle> 
 
      </asp:DataGrid>
 
   </form>
 
</body>
</h

解决方案 »

  1.   

    <html>
    <script runat="server">   ICollection CreateDataSource() 
       {
          DataTable dt = new DataTable();
          DataRow dr;      dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
          dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
          dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
          for (int i = 0; i < 9; i++) 
          {
             dr = dt.NewRow();         dr[0] = i;
             dr[1] = "Item " + i.ToString();
             dr[2] = 1.23 * (i + 1);         dt.Rows.Add(dr);
          }      DataView dv = new DataView(dt);
          return dv;
       }   void Page_Load(Object sender, EventArgs e) 
       {      if (!IsPostBack) 
          {
             // Need to load this data only once.
             ItemsGrid.DataSource= CreateDataSource();
             ItemsGrid.DataBind();
          }
       }</script><body>   <form runat="server">      <h3>DataGrid Example</h3>      <b>Product List</b>      <asp:DataGrid id="ItemsGrid"
               BorderColor="black"
               BorderWidth="1"
               CellPadding="3"
               HeaderStyle-BackColor="#00aaaa"
               AutoGenerateColumns="true"
               runat="server">      </asp:DataGrid>   </form></body>
    </html>
    下面的示例说明如何在 DataGrid 控件中使用分页。[Visual Basic]
    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Data" %>
     
    <html>   <script runat="server">
     
          Dim Cart As DataTable
          Dim CartView As DAtaView      Function CreateDataSource() As ICollection         Dim dt As New DataTable()
             Dim dr As DataRow
                
             dt.Columns.Add(New DataColumn("IntegerValue", GetType(Int32)))
             dt.Columns.Add(New DataColumn("StringValue", GetType(String)))
             dt.Columns.Add(New DataColumn("CurrencyValue", GetType(Double)))
                
             Dim i As Integer
             For i = 0 To 99
                dr = dt.NewRow()
                    
                dr(0) = i
                dr(1) = "Item " + i.ToString()
                dr(2) = 1.23 *(i + 1)
                dt.Rows.Add(dr)
             Next i
                
             Dim dv As New DataView(dt)
             Return dv      End Function 'CreateDataSource      Sub Page_Load(sender As Object, e As EventArgs)
                
             If Not IsPostBack Then
                ' Need to load this data only once.
                ItemsGrid.DataSource = CreateDataSource()
                ItemsGrid.DataBind()
             End If
                
             If CheckBox1.Checked Then
                ItemsGrid.PagerStyle.Mode = PagerMode.NumericPages
             Else
                ItemsGrid.PagerStyle.Mode = PagerMode.NextPrev
             End If       End Sub 'Page_Load      Sub Grid_Change(sender As Object, e As DataGridPageChangedEventArgs)
                
             ' Set CurrentPageIndex to the page the user clicked.
             ItemsGrid.CurrentPageIndex = e.NewPageIndex
                
             ' Rebind the data. 
             ItemsGrid.DataSource = CreateDataSource()
             ItemsGrid.DataBind()      End Sub 'Grid_Change  </script>
     
    <body>
     
       <form runat="server">      <h3>DataGrid Paging Example</h3>
     
          <asp:DataGrid id="ItemsGrid" runat="server"
               BorderColor="black"
               BorderWidth="1"
               CellPadding="3"
               AllowPaging="true"
               AutoGenerateColumns="false"        
               OnPageIndexChanged="Grid_Change">
     
             <HeaderStyle BackColor="#00aaaa">
             </HeaderStyle>
      
             <PagerStyle Mode="NextPrev">
             </PagerStyle>          <Columns>            <asp:BoundColumn 
                     HeaderText="Number" 
                     DataField="IntegerValue"/>
     
                <asp:BoundColumn 
                     HeaderText="Item" 
                     DataField="StringValue"/>            <asp:BoundColumn 
                     HeaderText="Price" 
                     DataField="CurrencyValue" 
                     DataFormatString="{0:c}">
     
                   <ItemStyle HorizontalAlign="right">
                   </ItemStyle>
         
                </asp:BoundColumn>         </Columns>      </asp:DataGrid>      <br>      <asp:CheckBox id="CheckBox1" 
                        Text="Show page navigation"
                        AutoPostBack="true"
                        runat="server"/>
     
       </form>
     
    </body>
    </html>
    [C#]
    <%@ Page Language="C#" %>
    <%@ Import Namespace="System.Data" %>
     
    <html>   <script runat="server">
     
          DataTable Cart;
          DataView CartView;
     
          ICollection CreateDataSource() 
          {
             DataTable dt = new DataTable();
             DataRow dr;
     
             dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
             dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
             dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
     
             for (int i = 0; i < 100; i++) 
             {
                dr = dt.NewRow();
     
                dr[0] = i;
                dr[1] = "Item " + i.ToString();
                dr[2] = 1.23 * (i+1); 
                dt.Rows.Add(dr);
             }
     
      

  2.   

    DataView dv = new DataView(dt);
             return dv;
          }
     
          void Page_Load(Object sender, EventArgs e) 
          { 
     
             if (!IsPostBack) 
             {
                // Need to load this data only once.
                ItemsGrid.DataSource = CreateDataSource();
                ItemsGrid.DataBind();
             }
     
             if (CheckBox1.Checked)
                ItemsGrid.PagerStyle.Mode = PagerMode.NumericPages;
             else
                ItemsGrid.PagerStyle.Mode = PagerMode.NextPrev;      }
     
          void Grid_Change(Object sender, DataGridPageChangedEventArgs e) 
          {
     
             // Set CurrentPageIndex to the page the user clicked.
             ItemsGrid.CurrentPageIndex = e.NewPageIndex;         // Rebind the data. 
             ItemsGrid.DataSource = CreateDataSource();
             ItemsGrid.DataBind();
          
          }
     
       </script>
     
    <body>
     
       <form runat="server">      <h3>DataGrid Paging Example</h3>
     
          <asp:DataGrid id="ItemsGrid" runat="server"
               BorderColor="black"
               BorderWidth="1"
               CellPadding="3"
               AllowPaging="true"
               AutoGenerateColumns="false"        
               OnPageIndexChanged="Grid_Change">
     
             <HeaderStyle BackColor="#00aaaa">
             </HeaderStyle>
     
             <PagerStyle Mode="NextPrev">
             </PagerStyle>          <Columns>            <asp:BoundColumn 
                     HeaderText="Number" 
                     DataField="IntegerValue"/>
       
                <asp:BoundColumn 
                     HeaderText="Item" 
                     DataField="StringValue"/>            <asp:BoundColumn 
                     HeaderText="Price" 
                     DataField="CurrencyValue" 
                     DataFormatString="{0:c}">
     
                   <ItemStyle HorizontalAlign="right">
                   </ItemStyle>
         
                </asp:BoundColumn>         </Columns>      </asp:DataGrid>      <br>      <asp:CheckBox id="CheckBox1" 
                        Text="Show page navigation"
                        AutoPostBack="true"
                        runat="server"/>
     
       </form>
     
    </body>
    </html>
    通常情况下,每当 DataGrid 控件显示一页信息时,就加载包含列表中所有项的数据源。如果数据源非常大,这可能会耗费大量资源。自定义分页使您可以只加载显示该页所需的数据段。若要启用自定义分页,请将 AllowPaging 属性和 AllowCustomPaging 属性设置为 true 并提供处理 PageIndexChanged 事件的代码。PageIndexChanged 事件的典型逻辑是将 CurrentPageIndex 属性设置为要显示页的索引,然后将数据源重新绑定到该控件。要显示的页的索引通常是通过传递给事件处理程序的 DataGridPageChangedEventArgs 对象的 NewPageIndex 属性来访问的。然后,创建包含要在单个页上显示的数据的数据源。创建数据源后,使用 DataBind 方法将数据源绑定到 DataGrid 控件。由于只加载了一个数据段,因此将 VirtualItemCount 属性设置为要在 DataGrid 控件中显示的项的总数。这使控件可以确定分页控件所需的总页数。使用自定义分页时,DataGrid 控件假定数据源只包含要在当前页上显示的项。数据源中数量等于由 PageSize 属性指定的项数的所有项都被显示出来。下面的示例说明如何在 DataGrid 控件中使用自定义分页。[Visual Basic]
    <%@ Page Language="VB" %>
    <%@ Import Namespace="System.Data" %><html>
       <script runat="server">      Dim start_index As Integer      Function CreateDataSource() As ICollection
                
             Dim dt As New DataTable()
             Dim dr As DataRow
                
             dt.Columns.Add(New DataColumn("IntegerValue", GetType(Int32)))
             dt.Columns.Add(New DataColumn("StringValue", GetType(String)))
             dt.Columns.Add(New DataColumn("CurrencyValue", GetType(Double)))
                
             Dim i As Integer
             For i = start_index To (start_index + ItemsGrid.PageSize) - 1
                dr = dt.NewRow()
                    
                dr(0) = i
                dr(1) = "Item " + i.ToString()
                dr(2) = 1.23 *(i + 1)
                    
                dt.Rows.Add(dr)
             Next i
               
             Dim dv As New DataView(dt)
             Return dv      End Function 'CreateDataSource