14 Ekim 2009 Çarşamba

DataGridView -1 (DataPropertyName)

Son yaptığım projede, tablo içinde combobox kullanımı istedi müşteriler. Ben de her zaman listeleme işlemi için ListView kullandığımdan ve onda da o özellik olmadığından bir arayış içine girdim. Sonunda da DataGridView'i keşfettim (Ben keşfetmedim aslında Mehmet Arslan keşfettirdi :) ). Projemde bugün itibariyle bittiğinden ancak bugün yazabildim bu yazıyı.

Açıkçası ListView mantığından çok farklı olduğundan çok uğraştırdı beni. Özellikle runtime'da yapılan değişiklikleri hemen kabul edip de yansıtmadığı için :) Şimdi bu sorunlardan aklımda kalanları ve çözümlerini yazalım.


Önce listview ile aynı mantıkta oluşturmuştum tablomu. Fakat, çok fazla arayüze bağımlı kod yazdığımı fark ettim. Bu da beni çok rahatsız etti. Örneğin sütunlara ulaşırken hep sütun indexlerini kullanmıştım ama sonradan eklenecek bir sütun, kodun tamamen değişmesine sebep olabilecekti. Daha sonra index değil de sütun isimleri kullanayım dedim ve bu şekilde düzelttim kodu. Ama bunu da beğenmedim, kod çok kalabalık görünüyordu gözüme. Bu yüzden, nasıl yaparım da bunu düzeltebilirim diye arkadaşlara danıştım ve bir çözüm yolu buldum.

DataGridView'e ListView mantığından farklı olarak DataSource verebildiğimizi öğrendim. Her bir sütun için bir property tanımladım. Böylelikle, sütunlar yerine property'leri hem okuyup, hem değiştirebilecektim. Ama bunları data source olarak verdiğimde, benim tanımladıklarımdan farklı olarak yeni sütunlar üretip, sütun başlıklarına property isimlerini verdi. Fakat bazı özellikler verdiğimden benim datagridi design time'da tanımlamam gerekiyordu. Biraz araştırma yaptıktan sonra DataGridView'in çok yararlı bir özelliği olduğunu gördüm.  




Edit Columns kısmından DataPropertyName özelliğine tanımladığımız property'nin ismini veriyoruz. Böylece otomatik olarak bu ikisini birbiriyle eşleştiriyor. Tanımlanan property kodu da şöyle:

public string Name { get; set; }

DataGridView'e data source verme işlemi:

TaskInformationItem item = new TaskInformationItem();
List<TaskInformationItem> items = new List<TaskInformationItem>();

item.Name="Sevgi"; items.Add(item);
dgProTaskTable.DataSource = items;

DataGridView'deki değerleri okuyabilmek için:

TaskInformationItem item = new TaskInformationItem();
item = this.dgProTaskTable.Rows[0].DataBoundItem as TaskInformationItem;

Böylece item.Name diyerek tablodaki değeri okuyabiliyoruz.

Hiç yorum yok:

Yorum Gönder