Condividi tramite


Controllo server Web DataGrid

Il controllo DataGrid esegue il rendering di una griglia in forma di tabella con associazione dati. Il controllo consente di definire diversi tipi di colonne per controllare il layout del contenuto delle celle della griglia (colonne associate, colonne modello) e aggiunge funzionalità specifiche, ad esempio colonne pulsante di modifica, colonne collegamento ipertestuale e così via. Inoltre, il controllo supporta diverse opzioni per l'invio di dati.

<asp:DataGridid="programmaticID"     DataSource='<%# DataBindingExpression %>'     AllowPaging="True|False"     AllowSorting="True|False"     AutoGenerateColumns="True|False"     BackImageUrl="url"     CellPadding="pixels"     CellSpacing="pixels"     DataKeyField="DataSourceKeyField"     GridLines="None|Horizontal|Vertical|Both"     HorizontalAlign="Center|Justify|Left|NotSet|Right"     PagedDataSource     PageSize="ItemCount"     ShowFooter="True|False"     ShowHeader="True|False"     VirtualItemCount="ItemCount"     OnCancelCommand="OnCancelCommandMethod"     OnDeleteCommand="OnDeleteCommandMethod"     OnEditCommand="OnEditCommandMethod"     OnItemCommand="OnItemCommandMethod"     OnItemCreated="OnItemCreatedMethod"     OnPageIndexChanged="OnPageIndexChangedMethod"     OnSortCommand="OnSortCommandMethod"     OnUpdateCommand="OnUpdateCommandMethod"     runat="server" >   <AlternatingItemStyle ForeColor="Blue"/>
   <EditItemStyle BackColor="Yellow"/>   <FooterStyle BorderColor="Gray"/>   <HeaderStyle BorderColor="Gray"/>   <ItemStyle Font-Bold="True"/>   <PagerStyle Font-Name="Ariel"/>   <SelectedItemStyle BackColor="Blue"/></asp:DataGrid>
or
<asp:DataGridid="programmaticID"     DataSource='<%# DataBindingExpression %>'     AutoGenerateColumns="False"     (other properties)     runat="server" >   <AlternatingItemStyle ForeColor="Blue"/>
   <EditItemStyle BackColor="Yellow"/>   <FooterStyle BorderColor="Gray"/>   <HeaderStyle BorderColor="Gray"/>   <ItemStyle Font-Bold="True"/>   <PagerStyle Font-Name="Ariel"/>   <SelectedItemStyle BackColor="Blue"/>   <Columns>      <asp:BoundColumn           DataField="DataSourceField"           DataFormatString="FormatString"           FooterText="FooterText"           HeaderImageUrl="url"           HeaderText="HeaderText"           ReadOnly="True|False"           SortExpression ="DataSourceFieldToSortBy"           Visible="True|False"           FooterStyle-property="value"           HeaderStyle-property="value"           ItemStyle-property="value"/>      <asp:ButtonColumn           ButtonType="LinkButton|PushButton"           Command="BubbleText"           DataTextField="DataSourceField"           DataTextFormatString="FormatString"           FooterText="FooterText"           HeaderImageUrl="url"           HeaderText="HeaderText"           ReadOnly="True|False"           SortExpression="DataSourceFieldToSortBy"           Text="ButtonCaption"           Visible="True|False"/>      <asp:EditCommandColumn           ButtonType="LinkButton|PushButton"           CancelText="CancelButtonCaption"           EditText="EditButtonCaption"           FooterText="FooterText"           HeaderImageUrl="url"           HeaderText="HeaderText"           ReadOnly="True|False"           SortExpression="DataSourceFieldToSortBy"           UpdateText="UpdateButtonCaption"           Visible="True|False"/>      <asp:HyperLinkColumn           DataNavigateURLField="DataSourceField"           DataNavigateURLFormatString="FormatExpression"           DataTextField="DataSourceField"           DataTextFormatString="FormatExpression"           FooterText="FooterText"           HeaderImageUrl="url"           HeaderText="HeaderText"           NavigateURL="url"           ReadOnly="True|False"           SortExpression="DataSourceFieldToSortBy"           Target="window"           Text="HyperLinkText"           Visible="True|False"/>      <asp:TemplateColumn           FooterText="FooterText"           HeaderImageUrl="url"           HeaderText="HeaderText"           ReadOnly="True|False"           SortExpression="DataSourceFieldToSortBy"           Visible="True|False">         <HeaderTemplate>            Header template HTML         </HeaderTemplate >         <ItemTemplate>            ItemTemplate HTML         </ItemTemplate>         <EditItemTemplate>            EditItem template HTML         </EditItemTemplate>         <FooterTemplate>            Footer template HTML         </FooterTemplate>      </asp:TemplateColumn>   </Columns></asp:DataGrid>

Osservazioni

Il controllo DataGrid visualizza i campi di un'origine dati sotto forma di colonne in una tabella. Ogni riga del controllo DataGrid rappresenta un record nell'origine dati. Il controllo DataGrid supporta le funzioni di selezione, modifica, eliminazione, invio e ordinamento.

Per impostazione predefinita, la proprietà AutoGenerateColumns è impostata su true; in tal modo viene creato un oggetto BoundColumn per ogni campo dell'origine dati. Il rendering di ciascun campo viene quindi eseguito sotto forma di colonna nel controllo DataGrid, nell'ordine in cui ogni campo viene riportato nell'origine dati.

Inoltre è possibile determinare manualmente quali colonne saranno visualizzate nel controllo DataGrid, se si imposta la proprietà AutoGenerateColumns su false e si elencano le colonne che si desidera includere tra i tag di apertura e di chiusura <Columns>. Le colonne specificate vengono aggiunte all'insieme Columns nell'ordine elencato. In tal modo è possibile controllare a livello di codice le colonne nel controllo DataGrid.

Nota   L'ordine in cui le colonne vengono visualizzate nel controllo DataGrid è determinato dall'ordine in cui le colonne vengono visualizzate nell'insieme Columns. Sebbene sia possibile modificare a livello di codice l'ordine delle colonne, modificando l'insieme Columns, è più semplice elencare le colonne nell'ordine di visualizzazione desiderato.

Nota   Le colonne dichiarate in modo esplicito possono essere utilizzate assieme a colonne generate automaticamente. Quando si utilizzano entrambi tipi di colonna, viene eseguito prima il rendering delle colonne dichiarate in modo esplicito, poi quello delle colonne generate automaticamente. Le colonne generate automaticamente non vengono aggiunte all'insieme Columns.

Diversi tipi di colonne determinano il comportamento delle colonne nel controllo. Il controllo DataGrid consente di utilizzare i tipi di colonne seguenti:

Tipo di colonna Descrizione
EditCommandColumn Include i comandi di modifica più comuni (Edit, Update, Cancel) in un tipo di colonna predefinito.
HyperLinkColumn Crea una colonna con un insieme di collegamenti ipertestuali associati al valore di un campo dati. In una griglia in cui è visualizzato un elenco di ordini, ad esempio, può essere inclusa una colonna collegamento ipertestuale dove il rendering del campo OrderID viene eseguito come collegamento ipertestuale a una pagina in cui sono visualizzati i dettagli dell'ordine.
BoundColumn Crea una colonna associata a un campo nell'origine dati e di cui viene eseguito il rendering in una cella di tabella utilizzando stili. È il tipo di colonna predefinito per il controllo DataGrid.
ButtonColumn Crea una colonna che contiene un pulsante di comando definito dall'utente, ad esempio Add o Remove, per ogni elemento nella colonna.
TemplateColumn Crea una colonna che consente di definire il layout dei controlli tramite modelli per gli elementi e i controlli HTML personalizzati.

Nella tabella seguente vengono fornite informazioni sulle colonne che si possono dichiarare per il controllo DataGrid.

Proprietà fondamentali di DataGridColumn

Le proprietà sono disponibili per tutti i tipi di colonna DataGrid.

Proprietà Descrizione
FooterText Testo da visualizzare sul bordo inferiore della colonna.
HeaderImageUrl URL di un'immagine ci cui viene eseguito il rendering al posto del testo di HeaderText nell'intestazione di colonna.
HeaderText Testo da visualizzare sul bordo superiore della colonna.
Owner Riferimento al controllo DataGrid a cui appartiene la colonna associata (sola lettura).

La proprietà è utilizzata solo in fase di programmazione.

SortExpression Nome del campo in base al quale ordinare l'origine dati, quando l'utente specifica l'ordinamento in base al contenuto della colonna.
Visible true se la colonna è visualizzata, in caso contrario, false.

Proprietà di BoundColumn

Proprietà Descrizione
DataField Campo o proprietà dell'oggetto in DataSource che rappresenterà l'origine dati per la colonna.
DataFormatString Stringa di espressione di formattazione che specifica il modo in cui il campo viene visualizzato nella cella. È simile alle espressioni di formattazione utilizzate dal metodo String.Format.
ReadOnly true se non è possibile modificare la colonna quando la riga è posta in modalità di modifica, in caso contrario, false.

Proprietà di ButtonColumn

Proprietà Descrizione
ButtonType Tipo del pulsante di cui eseguire il rendering. Il valore predefinito è LinkButton.

In fase di programmazione, la proprietà viene impostata utilizzando l'Enumerazione ButtonColumnType.

CommandName Stringa che indica il comando inviato quando si fa clic su un pulsante nella colonna. La stringa è disponibile nel metodo di gestione degli eventi tramite la proprietà CommandSource dell'oggetto dell'argomento dell'evento e.

Il controllo DataGrid riconosce alcuni nomi di comando standard, tra cui Select, Sort, Update, Cancel, Edit, Delete e Page.

DataTextField Nome di campo dal DataSource associato alla proprietà Text del pulsante in ButtonColumn.
DataTextFormatString Stringa di espressione di formattazione che specifica il modo in cui il campo viene visualizzato nella cella.
Text Didascalia che viene visualizzata sul pulsante nella colonna. Se la proprietà DataTextField è impostata, viene eseguito l'override di questo valore.

Proprietà di TemplateColumn

Proprietà Descrizione
EditItemTemplate Elementi e controlli HTML che definiscono la colonna quando si trova in modalità di modifica.
FooterTemplate Elementi e controlli HTML che definiscono il piè di pagina della colonna.
HeaderTemplate Elementi e controlli HTML che definiscono l'intestazione della colonna.
ItemTemplate Elementi e controlli HTML che definiscono la colonna quando viene visualizzata.

Proprietà di HyperLinkColumn

Proprietà Descrizione
DataNavigateURLField Campo o proprietà dell'oggetto in DataSource che fornisce l'URL della pagina in cui spostarsi.
DataNavigateURLFormatString Espressione di formattazione da utilizzare con la proprietà Text.
DataTextField Campo o proprietà dell'oggetto in DataSource che rappresenta l'origine dati per la proprietà Text delle colonne.
DataTextFormatString Stringa di formattazione che specifica il modo in cui la proprietà Text viene visualizzata nel controllo.
NavigateURL URL della pagina in cui spostarsi. Se la proprietà DataNavigateURLField è impostata, viene eseguito l'override di questo valore.
Target Finestra di destinazione in cui è visualizzata la pagina. Può essere il nome di una finestra o il riferimento a un frame, ad esempio _TOP.
Text Testo del collegamento ipertestuale.

Proprietà di EditCommandColumn

Proprietà Descrizione
ButtonType Tipo del pulsante di cui eseguire il rendering. Il valore predefinito è LinkButton.

In fase di programmazione, la proprietà viene impostata utilizzando l'Enumerazione ButtonColumnType.

EditText Stringa che viene visualizzata sul pulsante Edit.
UpdateText Stringa che viene visualizzata sul pulsante Update.
CancelText Stringa che viene visualizzata sul pulsante Cancel.

Se si impostano le proprietà di stile delle diverse parti del controllo, è possibile personalizzare l'aspetto del controllo DataGrid. Nella tabella seguente sono elencate le diverse proprietà di stile per le diverse parti del controllo DataGrid.

Proprietà di stile

Proprietà di stile Descrizione Classe di stile
AlternatingItemStyle Stile di elementi alternati. TableItemStyle
EditItemStyle Stile dell'elemento in corso di modifica. TableItemStyle
FooterStyle Stile del piè di pagina al termine dell'elenco (se presente). TableItemStyle
HeaderStyle Stile dell'intestazione all'inizio dell'elenco (se presente). TableItemStyle
ItemStyle Stile dei singoli elementi. Style
PagerStyle Stile dei controlli di selezione della pagina. DataGridPagerStyle
SelectedItemStyle Stile dell'elemento attualmente selezionato. TableItemStyle

Per informazioni sulle proprietà supportate per ciascuna classe di stile, vedere Proprietà dell'oggetto di stile.

Il controllo DataGrid contiene funzionalità incorporate che consentono di visualizzarne il contenuto nei segmenti di pagina. Il numero di elementi visualizzati nella pagina è determinato dalla proprietà PageSize. Se non è specificato alcun valore per la proprietà PageSize, il controllo DataGrid visualizza dieci elementi alla volta nella pagina.

Per impostazione predefinita, il paging è disattivato. Per attivarlo, impostare la proprietà AllowPaging su true e inserire il codice per la gestione dell'evento PageIndexChanged. La normale logica per l'evento PageIndexChanged consiste nell'impostare la proprietà CurrentPageIndex sull'indice della pagina che si desidera visualizzare e ricollegare l'origine dati al controllo. In genere, è possibile accedere all'indice della pagina da visualizzare mediante la proprietà NewPageIndex dell'oggetto DataGridPageChangedEventArgs passato al gestore eventi.

Con il paging standard, il controllo DataGrid presuppone che l'origine dati contenga tutti gli elementi che si desidera visualizzare. Il controllo DataGrid calcola gli indici degli elementi nella pagina corrente in base all'indice di pagina specificato dalla proprietà CurrentPageIndex e al numero di elementi nella pagina specificato dalla proprietà PageSize.

È possibile personalizzare ulteriormente l'aspetto del controllo DataGrid, aggiungendo a livello di codice attributi ai tag <td> e <tr> generati dal controllo DataGrid. Gli attributi possono essere inseriti nei tag creando un gestore eventi personalizzato per l'evento ItemCreated o ItemDataBound. In generale, gli attributi sono aggiunti al gestore eventi per l'evento ItemCreated. Tuttavia, se gli attributi dipendono dai dati effettivi, devono essere aggiunti nel gestore per l'evento ItemDataBound.

Per aggiungere un attributo al tag <td>, è innanzitutto necessario recuperare l'oggetto TableCell che rappresenta la cella nel controllo DataGrid a cui si desidera aggiungere l'attributo. È possibile utilizzare l'insieme Control.Controls per la proprietà Item (indicizzatore DataGridItemEventArgs) dell'oggetto DataGridItemEventArgs passato nel gestore eventi, per ottenere l'oggetto TableCell desiderato. Quindi, è possibile utilizzare il metodo AttributeCollection.Add dell'insieme Attributes di TableCell per aggiungere attributi al tag <td>.

Per aggiungere un attributo al tag <tr>, è innanzitutto necessario recuperare l'oggetto DataGridItem che rappresenta la riga nel controllo DataGrid a cui si desidera aggiungere l'attributo. È possibile utilizzare la proprietà Item (indicizzatore DataGridItemEventArgs) dell'oggetto DataGridItemEventArgs passato nel gestore eventi, per ottenere l'oggetto DataGridItem desiderato. Quindi, è possibile utilizzare il metodo AttributeCollection.Add dell'insieme Attributes di DataGridItem per aggiungere attributi al tag <tr>.

Attenzione   Il testo non viene codificato in formato HTML prima di essere visualizzato nel controllo DataGrid. È pertanto possibile incorporare script all'interno dei tag HTML presenti nel testo. Se i valori del controllo provengono dall'input dell'utente, assicurarsi di convalidare tali valori per evitare problemi di protezione.

Per informazioni dettagliate sulle proprietà e sugli eventi del controllo server Web DataGrid, vedere la documentazione di Classe DataGrid.

Esempio

Nell'esempio seguente viene mostrato come utilizzare il controllo DataGrid per visualizzare gli elementi dell'origine dati.

<%@ Page Language="VB" AutoEventWireup="True" %>
<%@ 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>
</html>
[C#]
<%@ Page Language="C#" AutoEventWireup="True" %>
<%@ Import Namespace="System.Data" %>

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

Nell'esempio seguente viene mostrato come utilizzare il paging in un controllo DataGrid.

<%@ Page Language="VB" AutoEventWireup="True" %>
<%@ 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#" AutoEventWireup="True" %>
<%@ 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);
         }
 
         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>

Generalmente, ogni volta che il controllo DataGrid visualizza una pagina di informazioni, viene caricata un'origine dati che contiene tutti gli elementi dell'elenco. Un'origine dati è di dimensioni elevate, rende necessario l'uso di numerose risorse. Il paging personalizzato consente di caricare solo il segmento di dati necessario per la visualizzazione della pagina.

Per attivare il paging personalizzato, impostare le proprietà AllowPaging e AllowCustomPaging su true e inserire il codice per la gestione dell'evento PageIndexChanged. La normale logica per l'evento PageIndexChanged consiste nell'impostare la proprietà CurrentPageIndex sull'indice della pagina che si desidera visualizzare e ricollegare l'origine dati al controllo. In genere, è possibile accedere all'indice della pagina da visualizzare mediante la proprietà NewPageIndex dell'oggetto DataGridPageChangedEventArgs passato al gestore eventi. Quindi, creare un'origine dati che contiene i dati da visualizzare in una pagina. Una volta creata l'origine dati, associarla al controllo DataGrid utilizzando il metodo DataBind. Poiché viene caricato solo un segmento dei dati, è necessario impostare la proprietà VirtualItemCount con il numero totale di elementi che si desidera visualizzare nel controllo DataGrid. In tal modo è possibile determinare il numero totale di pagine necessarie per i controlli di paging.

Quando si utilizza il paging personalizzato, il controllo DataGrid presuppone che l'origine dati contenga solo gli elementi da visualizzare nella pagina corrente. Vengono visualizzati tutti gli elementi dell'origine dati fino al numero specificato dalla proprietà PageSize.

Nell'esempio seguente viene mostrato come utilizzare il paging personalizzato in un controllo DataGrid.

<%@ Page Language="VB" AutoEventWireup="True" %>
<%@ 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
        
      Sub Page_Load(sender As Object, e As EventArgs)
            
         If CheckBox1.Checked Then
            ItemsGrid.PagerStyle.Mode = PagerMode.NumericPages
         Else
            ItemsGrid.PagerStyle.Mode = PagerMode.NextPrev
         End If 

         If Not IsPostBack Then
            start_index = 0
            ItemsGrid.VirtualItemCount = 100
         End If
            
         BindGrid()

      End Sub 'Page_Load

      Sub Grid_Change(sender As Object, e As DataGridPageChangedEventArgs)
            
          ItemsGrid.CurrentPageIndex = e.NewPageIndex
          start_index = ItemsGrid.CurrentPageIndex * ItemsGrid.PageSize
          BindGrid()
 
      End Sub 'Grid_Change

      Sub BindGrid()
            
         ItemsGrid.DataSource = CreateDataSource()
         ItemsGrid.DataBind()

      End Sub 'BindGrid 

   </script>

<body>

   <form runat="server">

      <h3>DataGrid Custom Paging Example</h3>

      <asp:DataGrid id="ItemsGrid" runat="server"
           BorderColor="black"
           BorderWidth="1"
           CellPadding="3"
           AllowPaging="true"
           AllowCustomPaging="true"
           AutoGenerateColumns="false"
           OnPageIndexChanged="Grid_Change">

         <PagerStyle NextPageText="Forward"
                     PrevPageText="Back"
                     Position="Bottom"
                     PageButtonCount="5"
                     BackColor="#00aaaa">
         </PagerStyle>

         <AlternatingItemStyle BackColor="yellow">
         </AlternatingItemStyle>

         <HeaderStyle BackColor="#00aaaa">
         </HeaderStyle>

         <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#" AutoEventWireup="True" %>
<%@ Import Namespace="System.Data" %>

<html>
   <script runat="server">

      int start_index;

      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 = start_index; i < start_index + ItemsGrid.PageSize; 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 (CheckBox1.Checked)
            ItemsGrid.PagerStyle.Mode=PagerMode.NumericPages;
         else
            ItemsGrid.PagerStyle.Mode=PagerMode.NextPrev;

         if (!IsPostBack)
         {
            start_index = 0; 
            ItemsGrid.VirtualItemCount=100; 
         }

         BindGrid();
      
      }

      void Grid_Change(Object sender, DataGridPageChangedEventArgs e) 
      {
       
         ItemsGrid.CurrentPageIndex = e.NewPageIndex;
         start_index = ItemsGrid.CurrentPageIndex * ItemsGrid.PageSize;
         BindGrid();
     
      }

      void BindGrid() 
      {

         ItemsGrid.DataSource=CreateDataSource();
         ItemsGrid.DataBind();
     
      }

   </script>

<body>

   <form runat="server">

      <h3>DataGrid Custom Paging Example</h3>

      <asp:DataGrid id="ItemsGrid" runat="server"
           BorderColor="black"
           BorderWidth="1"
           CellPadding="3"
           AllowPaging="true"
           AllowCustomPaging="true"
           AutoGenerateColumns="false"
           OnPageIndexChanged="Grid_Change">

         <PagerStyle NextPageText="Forward"
                     PrevPageText="Back"
                     Position="Bottom"
                     PageButtonCount="5"
                     BackColor="#00aaaa">
         </PagerStyle>

         <AlternatingItemStyle BackColor="yellow">
         </AlternatingItemStyle>

         <HeaderStyle BackColor="#00aaaa">
         </HeaderStyle>

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

Inoltre, il controllo DataGrid offre capacità di ordinamento incorporate. Quando la funzionalità di ordinamento è attivata, nell'intestazione di ogni colonna viene eseguito il rendering dei controlli LinkButton che consentono di ordinare il controllo DataGrid in base alla colonna selezionata. L'evento SortCommand viene generato quando si fa clic su un controllo LinkButton. È compito del programmatore inserire il codice per il gestore eventi. La normale logica per il gestore consiste nell'ordinare l'elenco, quindi riassociare i dati al controllo DataGrid.

Nell'esempio seguente viene mostrato come utilizzare l'ordinamento in un controllo DataGrid.

<%@ Page Language="VB" AutoEventWireup="True" %>
<%@ Import Namespace="System.Data" %>
 
<html>
   <script runat="server">
    
      Dim SortExpression As String
 
      Function CreateDataSource() As ICollection

         Dim dt As New DataTable()
         Dim dr As DataRow
         Dim Rand_Num As New Random()
        
         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 14
            dr = dt.NewRow()
            
            dr(0) = i
            dr(1) = "Item " & i.ToString()
            dr(2) = 1.23 * Rand_Num.Next(1, 15)
            
            dt.Rows.Add(dr)
         Next i
        
         Dim dv As New DataView(dt)
         dv.Sort = SortExpression
         Return dv

      End Function 'CreateDataSource

      Sub Page_Load(sender As Object, e As EventArgs)
        
         If Not IsPostBack Then
            
            If SortExpression = "" Then
               SortExpression = "IntegerValue"
            End If

            ItemsGrid.DataSource = CreateDataSource()
            ItemsGrid.DataBind()

         End If

      End Sub 'Page_Load

      Sub Sort_Grid(sender As Object, e As DataGridSortCommandEventArgs)
    
         SortExpression = e.SortExpression.ToString()
         ItemsGrid.DataSource = CreateDataSource()
         ItemsGrid.DataBind()

      End Sub 'Sort_Grid
 
   </script>
 
<body>
 
   <form runat="server">
 
      <h3>DataGrid Sorting Example</h3>
 
      <asp:DataGrid id="ItemsGrid" runat="server"
           BorderColor="black"
           BorderWidth="1"
           CellPadding="3"
           AllowSorting="true"
           OnSortCommand="Sort_Grid"
           HeaderStyle-BackColor="#00aaaa"
           AutoGenerateColumns="true"/>
 
   </form>
 
</body>
</html>
[C#]
<%@ Page Language="C#" AutoEventWireup="True" %>
<%@ Import Namespace="System.Data" %>
 
<html>

   <script runat="server">
    
      string SortExpression;
 
      ICollection CreateDataSource() 
      {
         DataTable dt = new DataTable();
         DataRow dr;
         Random Rand_Num = new Random();
 
         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 < 15; i++) 
         {
            dr = dt.NewRow();
   
            dr[0] = i;
            dr[1] = "Item " + i.ToString();
            dr[2] = 1.23 * Rand_Num.Next(1, 15);
 
            dt.Rows.Add(dr);
         }
 
         DataView dv = new DataView(dt);
         dv.Sort=SortExpression;
         return dv;
      }
 
      void Page_Load(Object sender, EventArgs e) 
      {
         if (!IsPostBack) 
         {
 
            if (SortExpression == "")
               SortExpression = "IntegerValue";      
            ItemsGrid.DataSource = CreateDataSource();
            ItemsGrid.DataBind();
         }
      }
 
      void Sort_Grid(Object sender, DataGridSortCommandEventArgs e) 
      {
         SortExpression = e.SortExpression.ToString();
         ItemsGrid.DataSource = CreateDataSource();
         ItemsGrid.DataBind();
      }
 
   </script>
 
<body>
 
   <form runat="server">
 
      <h3>DataGrid Sorting Example</h3>
 
      <asp:DataGrid id="ItemsGrid" runat="server"
           BorderColor="black"
           BorderWidth="1"
           CellPadding="3"
           AllowSorting="true"
           OnSortCommand="Sort_Grid"
           HeaderStyle-BackColor="#00aaaa"
           AutoGenerateColumns="true"/>
 
   </form>
 
</body>
</html>

Vedere anche

Controlli server Web | Classe DataGrid