2010-09-21 96 views
0

使我在DataGrid中启用分页,可以有,每页10行。另外我有16行DataTable。我想用'for'循环动态填充数据网格,以遍历所有DataTable并填充DataGrid。分页填充数据网格在asp.net

我知道当计数器打到第11行时会出现问题。当计数器为11时,是否需要更改数据网格的页面?因为它不允许我在数据网格中添加多于10行。

会appriciate如果有人可以告诉我如何实现它。

由于提前,

格雷格

+0

是否有您填写的手DataGrid中的一个理由使用for循环?通常你只需设置DataSource然后调用'DataBind'。 – PhilPursglove 2010-09-21 12:15:49

+0

是的。因为我在该数据网格中有模板复选框,并且在某些情况下我需要检查它们,而在某些情况下则不需要。 – 2010-09-21 12:42:13

+0

难道你不能在ItemDataBound中做到这一点吗? – PhilPursglove 2010-09-22 10:24:14

回答

2

这是非常如何我做到这一点。我没有使用for作为复选框的条件检查在ItemDataBound中,通过这样做,DataGrid将为我完成所有分页。

标记:

<asp:DataGrid runat="server" ID="MyDataGrid" AllowPaging="true" PageSize="10" OnPageIndexChanged="MyDataGrid_PageIndexChanged" OnItemDataBound="MyDataGrid_ItemDataBound" Autogeneratecolumns="false"> 
    <Columns> 
     <asp:BoundColumn DataField="Number" HeaderText="Number" /> 
     <asp:TemplateColumn> 
      <ItemTemplate> 
       <asp:CheckBox runat="server" ID="CheckBox" /> 
      </ItemTemplate> 
     </asp:TemplateColumn> 
    </Columns> 
</asp:DataGrid> 

代码隐藏:

protected void Page_Load(object sender, EventArgs e) 
    { 
     DataTable numberDataTable; 

     if (!IsPostBack) 
     { 
      // Build a 16-row DataTable 
      numberDataTable = new DataTable(); 
      numberDataTable.Columns.Add(new DataColumn("Number")); 

      for (int c = 1; c < 17; c++) 
      { 
       DataRow numberDataRow = numberDataTable.NewRow(); 
       numberDataRow[0] = c; 
       numberDataTable.Rows.Add(numberDataRow); 
      } 

      ViewState.Add("Data", numberDataTable); 

      // DataBind the table into the DataGrid 
      MyDataGrid.DataSource = numberDataTable; 
      MyDataGrid.DataBind(); 
     } 
    } 

    protected void MyDataGrid_PageIndexChanged(object sender, DataGridPageChangedEventArgs e) 
    { 
     DataTable numberDataTable; 

     // Get the DataTable out of Viewstate 
     numberDataTable = (DataTable)ViewState["Data"]; 

     // Set the new page number 
     MyDataGrid.CurrentPageIndex = e.NewPageIndex; 

     // Bind the grid 
     MyDataGrid.DataSource = numberDataTable; 
     MyDataGrid.DataBind(); 
    } 

    protected void MyDataGrid_ItemDataBound(object sender, DataGridItemEventArgs e) 
    { 
     DataRow numberDataRow; 

     // Selective checking of the CheckBox 

     // Only do this for Item and ALternatingItem, we don't do this for headers, footers etc 
     if (e.Item.ItemType == ListItemType.Item | e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
      numberDataRow = ((DataRowView)e.Item.DataItem).Row; 

      // Check if we have an even number 
      if ((int.Parse(numberDataRow[0].ToString()) % 2) == 0) 
      { 
       // Find our checkbox control in the DataGrid for the current row and check it 
       CheckBox checkBox = (CheckBox)e.Item.FindControl("CheckBox"); 
       checkBox.Checked = true; 
      } 
     } 
    } 

这给:

alt text
alt text