La GridView è sicuramente il controllo più complesso che è stato aggiunto nella versione 2.0 di ASP.NET, poichè ti permette di realizzare con pochi click funzionalità di paging e sorting dei dati; questi dati devono però essere presi da dei Data Source Control.
Se invece, vogliamo effettuare un databind "a mano" della GridView, dobbiamo implementare sia i meccanismi di paging che quelli di sorting. Se questo non viene fatto, e viene messa a True la proprietà AllowPaging, verrà sollevata un'eccezione con questo messaggio:

The GridView 'GridViewID' fired event PageIndexChanging which wasn't handled

Per evitare questo banale errore, bisogna implementare gli event handler per gli eventi Sorting e PageIndexChanging.

<asp:GridView ID="GridView1" runat="server"

AutoGenerateColumns="false"
OnPageIndexChanging="GridView1_PageIndexChanging"
OnSorting="GridView1_Sorting"
PageSize="15"
AllowPaging="true"
AllowSorting="true"
>

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)

{
GridView1.PageIndex = e.NewPageIndex;
GridView1.DataBind();
}

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
DataTable dt = GridView1.DataSource as DataTable;

if (dt != null)
{
DataView dv = new DataView(dt);
dv.Sort = String.Format("{0} {1}", e.SortExpression, ConvertSort(e.SortDirection));

GridView1.DataSource = dv;
GridView1.DataBind();
}
}

private string ConvertSort(SortDirection sortDirection)
{
string m_SortDirection = String.Empty;
switch (sortDirection)
{
case SortDirection.Ascending:
m_SortDirection = "ASC";
break;

case SortDirection.Descending:
m_SortDirection = "DESC";
break;
}
return m_SortDirection;
}

In questo modo possiamo sfruttare le funzionalità di sorting e paging del controllo di GridView, anche se non lo colleghiamo ad un data source control e se effettuiamo un databind esplicito via codice o tramite le nostre classi di buisiness.