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.