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

 

GridView: applicare uno stile sulla colonna ordinata

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

Comments have been closed on this topic.
 

 

Copyright © Luca Mauri