2010-09-21 6 views
0

J'ai une grille de données avec pagination activée qui peut avoir 10 lignes par page. J'ai aussi DataTable avec 16 lignes. Je veux remplir dynamiquement la grille de données avec la boucle 'for' pour parcourir tous les DataTable et remplir le DataGrid.Remplir la grille de données avec pagination activée dans asp.net

Je comprends qu'il y a un problème lorsque le compteur atteindra la ligne 11. Ai-je besoin de changer la page de la grille de données lorsque le compteur sera 11? Parce qu'il ne me laisse pas ajouter plus de 10 lignes dans le DataGrid.

Appricierait si quelqu'un peut me dire comment l'implémenter.

Merci à l'avance,

Greg

+0

Y at-il une raison vous remplissez la grille de données à la main en utilisant une boucle for? Normalement, vous devez simplement définir DataSource, puis appeler 'DataBind'. – PhilPursglove

+0

Oui. Parce que j'ai des cases à cocher de gabarit dans cette grille de données et dans certains cas je dois les vérifier et dans certains cas, non. –

+0

Vous ne pourriez pas faire cela dans ItemDataBound? – PhilPursglove

Répondre

2

C'est à peu près comment je le ferais. Je n'utilise pas un for car la vérification conditionnelle des cases à cocher est dans ItemDataBound, en faisant cela, le DataGrid fera tout le paging pour moi.

Markup:

<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> 

code-behind:

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; 
      } 
     } 
    } 

Cela donne:

alt text
alt text

Questions connexes