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>();
List<TaskInformationItem> items = new List<TaskInformationItem>();
item.Name="Sevgi"; items.Add(item);
dgProTaskTable.DataSource = items;
dgProTaskTable.DataSource = items;
DataGridView'deki değerleri okuyabilmek için:
TaskInformationItem item = new TaskInformationItem();
item = this.dgProTaskTable.Rows[0].DataBoundItem as TaskInformationItem;
item = this.dgProTaskTable.Rows[0].DataBoundItem as TaskInformationItem;
Böylece item.Name diyerek tablodaki değeri okuyabiliyoruz.
Hiç yorum yok:
Yorum Gönder