Ostatnio miałem w pracy potrzebę stworzenia kolumny w gridzie, która umożliwiałaby nie tylko binding, ale także wspierała możliwość template’owania. Wszędzie jest podawany przykład jak taki efekt uzyskać z poziomu pliku aspx a ja potrzebowałem uzyskać taki efekt z poziomu pliku cs.
Przeszukałem sporo stron i po połączeniu informacji na kilku z nich + dokumentacja MSDN’a i udało się stworzyć takową templateowalno-bindowalną kolumnę. Aby móc skorzystać z obu funkcjonalności należy zaimplementować metodę InstantiateIn z interface’u ITemplate i podpiąć się pod zdarzenie DataBinding, elementu(-ów), dla którego chcemy mieć możliwość Bindowania treści. Później wystarczy tylko użyć DataBinder.Eval i mamy pobraną wartość.
Całościowo kod wygląda mniej więcej tak:

    1     public class DataGridTemplate : ITemplate

    2     {

    3         private string _bindField;

    4         public DataGridTemplate(string bindField)

    5         {

    6             this._bindField = bindField;

    7         }

    8 

    9         LinkButton link;

   10         public void InstantiateIn(Control container)

   11         {

   12             link = new LinkButton();

   13             link.DataBinding += new EventHandler(link_DataBinding);

   14             container.Controls.Add(link);

   15         }

   16 

   17         void link_DataBinding(object sender, EventArgs e)

   18         {

   19             LinkButton link = sender as LinkButton;

   20             GridViewRow item = (GridViewRow)link.NamingContainer;

   21             link.Text = DataBinder.Eval(item.DataItem,

   22                 this._bindField).ToString();

   23         }        

   24     }

Użycie:

    1 TemplateField tf = new TemplateField();

    2 tf.ItemTemplate = new DataGridTemplate("elem1");           

    3 GridView1.Columns.Add(tf);

Może ktoś oszczędzi, w ten sposób, kilka minut poszukiwań…