Załóżmy następujący, całkiem popularny scenariusz: ASP.NET 1.1/2.0, kontrolka DataGrid i bindowany do niej DataSet lub inny obiekt z danymi pobranymi z BD (DataTable, DataView). Interesuje nas sposób wpływania na nagłówki grida tak, aby możliwe było przykładowo wprowadzenie dwuwierszowych komórek w nagłówkach i/lub łączenie odpowiednich komórek, tj.:

Domyślnie DataGrid tworzy nagłówki kolumn w jednym wierszu na podstawie kolekcji kolumn ze źródła danych (czyli np.
DataView.Table.Columns). Aby to naturalne zachowanie zostało zmienione, należy przejąć kontrolę nad renderowaniem grida. Wykorzystamy do tego celu metodę
SetRenderMethodDelegate, która oddeleguje obsługę renderowania grida
dgGrid na naszą metodę
GridRendering:
// najbezpieczniej umieścić po wywołaniu DataBind()
dgGrid.SetRenderMethodDelegate(new System.Web.UI.RenderMethod (GridRendering));
Teraz pozostaje tylko przygotować metodę
GridRendering, która będzie odpowiadała za zbudowanie grida. Tym samym schodzimy na niższy poziom procesu powstawania strony aspx, gdzie grid jest po prostu zbiorem odpowiednich dyrektyw języka HTML. Dzięki temu zyskujemy dostęp do wszystkich możliwości wpływania na layout, jakie daje nam HTML, CSS czy JavaScript. Przykładowy kod metody może wyglądać tak:
// using System.Web.UI;
// using System.Web.UI.WebControls;
private void GridRendering (HtmlTextWriter writer, Control ctrl)
{
// nagłówki
string header = @"
<tr>
<td colspan=""2"">A</td>
<td colspan=""2"">B</td>
</tr>
<tr>
<td>C</td>
<td>D</td>
<td>E</td>
<td>F</td>
</tr>
";
writer.Write(@"<table border=""1"">");
writer.Write(header);
// pozostałe komórki
Control GridControl = ctrl.Controls[0];
foreach (Control ctl in GridControl.Controls)
{
// rzutowanie
DataGridItem item = (DataGridItem)ctl;
// sprawdzenie typu komórki - aby pominąć nagłówki
if (item.ItemType != ListItemType.Header)
{
// ustawienie stylu CSS dla komórki i rendering
item.Attributes.Add("class","nazwa_CSS");
item.RenderControl(writer);
}
}
writer.Write("</table>");
}
Metoda
GridRendering najpierw drukuje zdefiniowane przez nas nagłówki kolumn - ich struktura/liczba musi być dostosowana do ilości kolumn w źródle danych, następnie wykonana zostaje pętla po pozostałych komórkach. Nie musimy dla nich za każdym razem drukować tagów HTML (budować elementów html-owej tabeli), wystarczy wywołanie metody
RenderControl(writer). Dodatkowo, aby ułatwić zarządzanie layoutem z poziomu CSS, do każdej komórki dodawany jest odpowiedni atrybut
class. Oczywiście atrybut ten może być również dodany do kodu HTML samego nagłówka (zmienna
header).
Możliwości samego rozwiązania są bardzo duże, można np. dynamicznie tworzyć złożone nagłówki, a od tego już tylko krok do tabeli przestawnej. Można również dowolnie kreować całego grida i tworzyć na jego bazie własne atrakcyjne i dostosowane do specyficznych potrzeb kontrolki.