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
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ń…
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl