Blog Stats
  • Posts - 171
  • Articles - 1
  • Comments - 197
  • Trackbacks - 5

 

GridView: default sorting

Una funzionalità penso abbastanza comune è quella di definire un ordinamento di default della griglia di dati che vogliamo visualizzare.

Vogliamo realizzare tutto ciò usando la GridView di ASP.NET 2.0, un ObjectDataSource come controllo di data binding ed in modo dichiarativo, ossia specificando direttamente nella pagina e sulla griglia gli attributi relativi all'ordinamento di default.

Presupposto di partenza è quello di realizzare un custom control che derivi dalla GridView originale:

public class MyGridView : System.Web.UI.WebControls.GridView
{

    ...
    ...
    
}

Nella pagina aspx avremo quindi una dichiarazione di questo tipo:

<dev:MyGridView runat="server" ID="gridViewProducts" 
        
AllowPaging="True"  AllowSorting="True" 
        
DataSourceID="objectDataSourceProducts" 
        
DefaultSortExpression="Code" DefaultSortDirection="Ascending">
...
...
</dev:MyGridView>

 

Le proprietà DefaultSortExpression e DefaultSortDirection le ho dichiarate all'interno del nuovo controllo MyGridView e determinano l'ordinamento di default da applicare.

La cosa più semplice da fare potrebbe essere quella di intervenire in qualche evento della griglia prima del data binding e modificare le proprietà SortExpression e SortDirection nel caso in cui la SortExpression sia vuota(questa condizione presuppone che sulla griglia non sia mai stato generato nessun evento di ordinamento su nessun campo).

Purtroppo tali proprietà sono solo in lettura e quindi non sono modificabili.

Una soluzione potrebbe essere quella di effettuarne l'ovveride per sostituirne la condizione iniziale con i nostri valori di default, dal momento che sia SortExpression che SortDirection sono virtual.

Ma anche qui un ostacolo ci barra la strada ed eccone spiegato il motivo.

Il databind su una GridView legata ad un DataBoundControl, come nel nostro caso un ObjectDataSource, invoca il metodo PerformSelect e quindi CreateDataSourceSelectArguments  per gestire i parametri di select che dovranno essere passati al metodo Select del DataSourceView:

protected override DataSourceSelectArguments CreateDataSourceSelectArguments()
{
    ...
    
    
bool flag1 = this.AllowPaging && view1.CanPage;
    
string text1 = this.SortExpressionInternal;
    
if ((this.SortDirectionInternal == SortDirection.Descending) && (text1.Length > 0))
 
     ...
}

Come si puo' vedere dall'estratto di codice recuperato grazie a Reflector, l'espressione di sort viene recuperata usando la proprietà interna SortExpressionInternal che a sua volta si appoggia ad una variabile privata.
A causa di questo presunto baco(probabilmente sarebbe stato corretto recuperare l'espressione di sorting direttamente tramite le proprietà pubbiche SortExpression e SortDirection) viene annullata la possibilià di passare il nostro default sorting tramite la sovrascrittura delle proprietà pubbliche.

Quindi, ci è rimasta un ultima possibilità, che è anche quella buona e forse più semplice, ossia ridefinire il metodo CreateDataSourceSelectArguments:

protected override DataSourceSelectArguments CreateDataSourceSelectArguments()
{
    DataSourceSelectArguments dataSourceSelectArguments = 
base.CreateDataSourceSelectArguments();

    
if (string.IsNullOrEmpty(dataSourceSelectArguments.SortExpression) && !string.IsNullOrEmpty(this.DefaultSortExpression))
    {
        dataSourceSelectArguments.SortExpression = 
this.DefaultSortExpression;
        
        
if (this.DefaultSortDirection == SortDirection.Descending)
        {
            dataSourceSelectArguments.SortExpression += " DESC";
        }
        
else
        
{
            dataSourceSelectArguments.SortExpression += " ASC";
        }
    }
    
    
return dataSourceSelectArguments;
}

Così facendo la nostra MyGridView potrà avere e gestire autonomamente l'ordinamento di default ed il nostro unico compito sarà quello di impostarne le proprietà nella pagina.

 

Comments have been closed on this topic.
 

 

Copyright © Luca Mauri