Una delle caratteristiche comuni che si vorrebbe
implementata sulla GridView di ASP.NET 2.0 è quella di poter applicare uno stile
diverso sulla colonna che è soggetta ad ordinamento.
Partiamo dal presupposto che dobbiamo costruirci la nostra GridView
personalizzata, derivandola ovviamente dalla GridView di ASP.NET.
A questo punto definiamo nel codice la proprietà che permette di definire lo
stile per la nostra colonna ordinata:
private TableItemStyle _columnSortedStyle;
[PersistenceMode(PersistenceMode.InnerProperty)]
[Category("Styles")]
[Description("ColumnSortedStyle")]
[NotifyParentProperty(true)]
public TableItemStyle ColumnSortedStyle
{
get
{
if (this._columnSortedStyle == null)
{
this._columnSortedStyle = new TableItemStyle();
if (base.IsTrackingViewState)
{
((IStateManager)this._columnSortedStyle).TrackViewState();
}
}
return this._columnSortedStyle;
}
}
Ora bisogna applicare questo stile sulla colonna ordinata.Per fare questo,
contrariamente a quanto potrebbe sembrare inizialmente, non è sufficiente
sovrascrivere l'evento OnRowCreated della
GridView.
Infatti analizzando con Reflector, è possibile vedere che gli
stili sulle righe vengono applicati durante l'evento
PrepareControlHierarchy, il quale viene invocato all'interno
del metodo di Render.
Quindi per applicare il nostro stile dovremo sovrascrivere il metodo
PrepareControlHierarchy e ciclare su tutte le righe e le celle
nel seguente modo:
protected override void PrepareControlHierarchy()
{
base.PrepareControlHierarchy();
if (this.AllowSorting)
{
foreach (GridViewRow row in this.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
{
foreach (DataControlFieldCell cell in row.Cells)
{
if (cell.ContainingField.SortExpression.Equals(this.SortExpression, StringComparison.InvariantCultureIgnoreCase))
{
cell.ApplyStyle(this.ColumnSortedStyle);
}
}
}
}
}
}