Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

11 Aralık 2007 Salı

DataGrid e kod ile TEMPLATECOLUMN eklemek

Bu aslında hafif bir çeviri olacak.Ama önemli ve geyik olmayan yerler için zamanım var.
Adresimiz: http://www.tek-tips.com/faqs.cfm?fid=4868

ITemplate Interface Hakkında...

Template kolonu çalışma zamanında oluşturmak çok kolaydır. Genel şekli aşağıdaki gibidir:
------------------
TemplateColumn tc = new TemplateColumn();
tc.HeaderText = [Text of column header];
tc.ItemTemplate = [ITemplate type];
// dg is the DataGrid control
dg.Columns.Add(tc);
------------------

Yukarıda da gördüğünüz gibi, basitçe TemplateColumn değişkeni üretebilir, Text ve ItemTemplate özelliklerini verebiliriz.Devam edelim.Önemli kısmı ItemTemplate özelliğidir. Gördğünüz gibi bir sınıf tanımlamalı ItemTemplate Interface inden türeyen.Böylece template column u üretip gride eklemek mümkün olacaktır.Thus, adding a template column to a grid at run time will consist of creating a class that implements the ITemplate interface. Bu sınıfın nasıl olduğunu şimdi göreceğiz.

Şimdi, ITempalte interface'nin sadece bir tane metodu vardır, InstantieateIn adında.Bu metod yeni bir örnek template kolon üretildiğinde çalışacaktır.System.Web.UI.Control tipinde bir parametre alır . Böylece bu metodu ile örneklediğiniz nesneyi oluşturduğunuz yerde template column create olmuş olur.(cümle berbat oldu ama idare edin). Benim durumumda bir check box a ihtiyacım olacak template columnun içinde ve sınıfım şöyle görünecek:

private class CheckBoxTemplate : ITemplate
{
// Implementation of ITemplate
public void InstantiateIn(System.Web.UI.Control container)
{
// Create a check box
CheckBox cb = new CheckBox();
// Make the check box appear in the column
container.Controls.Add(cb);
}
}


Hepsi bu! Bu template column oluşturmak için ihtiyacınız olan kod. Düşündüğünüz gibi, sizde text box ın özelliklerini set ettiğiniz gibi her ne kontrol oluşturuyorsanız template column içinde, onunda özelliklerini dilediğiniz gibi set edebilirsiniz. Yanı sıra, sadece bir kontrol kullanmaklada sınırlı değilsiniz. Dilediğiniz sayıda Template Column içine nesneler create edebilirsiniz(create etmek ne demekse) ...


Data Biding (veri bağlama)
Fakat hepsi bu değil! InstantiateIn metodu içinde veri çekmek ve kontrolonüze bağlamak mümkün. Veri bağlamayı uyarlamak, create ettiğiniz kontrolünüzün DataBinding olayına kod yazmakla mümkün olacak. Event handling(olaylarla başa çıkma) mekanizması Web ve Windows formlarındakiyle aynıdır: Bir metod create edersiniz aynı olayın temsilcisinin imzasıyla(isaretiyle) ve sonra temsilciye metodu eklersiniz. Sınıfınızın son hali kalın kısımla gösterilmiş:
[Yani diyorki bir metodu oluşturup DataBinding metoduymuş gibi sınıfınıza eklersiz. İşte yeni metodunuz,BindCheckBox ve bunu DataBinding işlemi halinde çalışması için sınıfınıza ekliyorsunuz...]

CODE

private class CheckBoxTemplate : ITemplate
{
public void InstantiateIn(System.Web.UI.Control
container)
{
// Create a check box
CheckBox cb = new CheckBox();
//Attach method to delegate
cb.DataBinding += new System.EventHandler(this.BindCheckBox);
container.Controls.Add(cb);
}

//Method that responds to the
DataBinding event

private void BindCheckBox(object sender, System.EventArgs e)
{
CheckBox cb = (CheckBox)sender;
DataGridItem container = (DataGridItem)cb.NamingContainer;
cb.Checked = [Data binding expression];
}
}
Gördüğünüz gibi, InstantiateIn metoduna yeni bir satır kod eklendi:

cb.DataBinding += new System.EventHandler(this.BindCheckBox);

Tüm bu eklemeler checkbox kontrolümüzün DataBinding event ında BindCheckBox methodunu çalıştırmak içindi. DataBinding event temsilcisinin iki parametresi vardır: object tipinde sender, ve EventArgs tipinde e,(Gerçekten bir databinding e ihtiyacımız yok). sender, harektin başladığı check box nesnesini gösterir , ve bu yüzden aşağıdaki koda ihtiyacımız vardır:

CheckBox cb = (CheckBox)sender;

Basitçe CheckBox gibi bir referansı getirir. Şimdi check boxın NamingContainer özelliği CheckBox kontrolünün olduğu DataGridItem(diğer bir değişle, satır(row)) u gösterir. Böylece Böylece aşağıdaki satırda grid içinde CheckBox ın olduğu satıra ulaşabiliriz:

DataGridItem container = (DataGridItem)cb.NamingContainer;

Sonuçta, "ItemID" adında bir veri kaynağından çektiği veriyi gösteren bir DataGrid imiz olduğunu farzedersek, veri bağlama ifadesini DataBinder.Eval metodunu kullanarak yazabiliriz. Aşağıdaki satırda(yukarıdaki kod olmayan) CheckBox ın Checked özelliğini, eper "ItemId" veri kaynağında 10 ise True olarak set edecektir.


cb.Checked = (DataBinder.Eval(container.DataItem, "ItemID").ToString() == "10";);

Bu durumda Eval metodunun ne olduğunu bilmiyorsunuz.DataGridItem(DataGrid içinde bir row demektir DataGridItem) içerisinde row içerisindeki bir alanın değerini, object tipinde döndüren bir metoddur. Elbette verilerinizi bağlayan ifadeniz daha karmaşık olabilir.Bu metodda dilediğiniz şeyi yapabilirsiniz...

Son olarak kalın ile yazılmış hali ile ItemTemplate inizi Template Column kısmına ekleyebilirsiniz.

TemplateColumn tc = new TemplateColumn();
tc.HeaderText = [Text of column header];
//Isn't this beautiful?
tc.ItemTemplate = new CheckBoxTemplate();
// dg is the DataGrid control
dg.Columns.Add(tc);

Cool, eh?