Makale Özeti

Bu makale dizisinin üçüncü bölümü olan bu makalede şimdiye kadar incelediğimiz konuları ve bu konular sayesinde yazmış olduğumuz Collection nesnesinin metodlarının kullanılmasını daha iyi kavranması bakımından örnek bir Windows Uygulaması üzerinde inceleyeceğiz. Bu makalenin sonunda gözümüze çarpan eksik konuları ise makale dizisinin ilerleyen bölümlerinde irdeliyor olacağız.

Makale

         Merhabalar,

         Bu makale dizisinin üçüncü bölümü olan bu makalede şimdiye kadar incelediğimiz konuları ve bu konular sayesinde yazmış olduğumuz Collection nesnesinin metodlarının kullanılmasını daha iyi kavranması bakımından örnek bir Windows Uygulaması üzerinde inceleyeceğiz. Bu makalenin sonunda gözümüze çarpan eksik konuları ise makale dizisinin ilerleyen bölümlerinde irdeliyor olacağız.

using System;
using System.Collections.Generic;
using System.Text;

namespace WindowsApplication1
{
      public class SampleEntity
      {
            private int mSampleId;
            public int SampleId
            {
                  get { return mSampleId;}
                  set{mSampleId = value;}
            }
            private string mSampleText;
            public string SampleText
            {
                  get{return mSampleText;}
                  set{mSampleText = value;}
            }
            private DateTime mSampleDate;
            public DateTime SampleDate
            {
                  get{return mSampleDate;}
                  set{mSampleDate = value;}
            }
            private Guid mSampleGuid;          
            public Guid SampleGuid
            {
                  get{return mSampleGuid;}
                  set{mSampleGuid = value;}
            }
      }
}

          Yazmış olduğumuz bu class bizim uygulamamızda entity görevi görecek ve DataBase'de bir row a karşılık gelecek verileri depolamaya yarayacaktır. Classımızda veritabanımızdaki her field 'e ve bu fiieldin veri tipine karşılık gelen member değişkenler ve bu değişkenlerin encapsule edilerek veri girişine veya okunmasına izin verecek olan public property'lerimiz vardır. Örnek uygulama olduğu için farklı veri tipleri kullanmaya özen gösterdimö Ancak daha öncedende değindiğim gibi genel metodumuzun çalışması için tek koşul property isimlerinin Database'de bulunan field(column) isimleriyle bire bir aynı olmasıdır.

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace WindowsApplication1
{
      public class SampleCollection : MyCollection<SampleEntity>
      { 
      }
}

         Bu Class dosyasında ise Collectionumuzu tanımlıyoruz ancak Collectionumuzu MyCollection classının SampleEntity Generic tipinden türetiyoruz. Artık collectionumuzun bütün metodları bu generic tip ile uyumlu hale gelmiştir ve bu class içine herhangi başka bir kod yazmamıza gerek yoktur. Mycollection base class'ının kodlarını ise daha önceki makalemde açıkladığım için burada tekrardan açıklama gereği duymuyorum.

         Artık projemizdeki Windows Form'unun dizaynına geçebiliriz. Formumuz Bir DataGridden ve buttonlardan oluşacaktır. Şekli aşağıdaki gibi olacaktır. Buradaki amaç yazdığımız MyCollection Base Classının metodlarının düzgün çalışıp çalışmadığının test edilmesidir.

         

         Formumuzun dizaynı bitince artık Formun Load metodundan başlayarak formumuzu kodlamaya başlayabiliriz.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.Common;

namespace WindowsApplication1
{
      public partial class Form1 : Form
      {
            public Form1()
            {
                  InitializeComponent();
            }
            public SampleCollection s = new SampleCollection();
            private void Form1_Load(object sender, EventArgs e)
            {
                  DbProviderFactory ProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
                  DbConnection Connection = ProviderFactory.CreateConnection();
                  Connection.ConnectionString = "data source=.;initial catalog=MyCollectionTest;integrated security=SSPI";
                  DbCommand cmd = ProviderFactory.CreateCommand();
                  cmd.CommandText = "Select TOP 5 * FROM Sample";
                  cmd.Connection = Connection;
                  DbDataReader dr;
                  Connection.Open();
                  dr = cmd.ExecuteReader();
                  s.SetDataFromReader(dr);
                  Connection.Close();
                  dataGridView1.DataSource = s;
            }

          Formumuzun Load metodunda DataBase e Bağlanıp verilerimizi çekiyoruz, bu işlemin nasıl yapıldığı ADO.Net konusu olduğundan bu makalede anlatılmamıştır. Ancak bizi ilgilendiren en önemli nokta Connection açıldıktan sonra Commandımızın ExecuteReader() metodunu kullanarak oluşturduğumuz DataReader'ın Collectionumuzun SetDataFromReader metoduna parametre olarak verilmesidir ve Connection'un bu işlemden sonra kapatılması gereğidir. Bir diğer dikkat etmemiz gereken konu ise Collectionımızın metodun içinde değilde Class Level olarak tanımlanmış olmasıdır ki buda bize collection umuza class içindeki herhangi bir metoddan erişme imkanı sunacaktır. Collectionumuzu oluşturduktan sonra DataGridView'ın DataSource propertysine collectionımızı vererek taşıdığı verileri DataGridView üzerinde gösterebiiriz.

            private void btnEkle_Click(object sender, EventArgs e)
            {
                  SampleEntity se = new SampleEntity();
                  se.SampleDate = DateTime.Now;
                  se.SampleGuid = Guid.NewGuid();
                  se.SampleId = 1;
                  se.SampleText = "EklemeDeneme";
                  s.Add(se);
                  dataGridView1.DataSource = null;
                  dataGridView1.DataSource = s;
            }

          Ekle butonunun Click event'ında ise Collectionumuzun Generic tipi olan Entitymizden bir instance alarak propertylerine değer atıyoruz ve bu entity'i collection'ımızın Add metodunu kullanarak collectionumuza ekliyoruz. Daha sonra ise collectionumuzu tekrardan DataGridView'in DataSource propertysine atayarak son halini görüntülüyoruz.

            private void btnEklenmisleriListele_Click(object sender, EventArgs e)
            {
                  dataGridView1.DataSource = s.GetChanges(MyCollection<SampleEntity>.ObjectStates.Added);
            }

          Bu butonun Click event'ında ise Collectionumuzun GetChanges Metodunu kullanıyoruz. Hatırlarsak bu metod parametre olarak aldığı State'e sahip nesneleri bize geri döndürüyordu. Istediğimiz veriler yeni eklenenler olduğundan dolayı parametre olarak ObjectState'i Added olarak tanımlıyoruz ve bu metodun geriye döndürdüğü ArrayList'i datagridimizin DataSource property'sine vererek verilerin gösterilmesini sağlıyoruz.

            private void btnGuncelle_Click(object sender, EventArgs e)
            {
                  SampleEntity se = new SampleEntity();
                  se.SampleDate = DateTime.Now;
                  se.SampleGuid = Guid.NewGuid();
                  se.SampleId = 1;
                  se.SampleText = "GuncellemeDeneme";
                  s[1] = se;
                  dataGridView1.DataSource = null;
                  dataGridView1.DataSource = s;
            }

         Güncelleme metodunda ise entitymizin bir instance'ini alıyoruz ve propertylere değer atayarak yeni bir entity oluşturuyoruz. Dana sonra Collectionımızın 2. elemanının(index numarası 1) artık bu entity olacağını belirtiyoruz. Ve tekrardan değişmiş veriyi DataGridView'de gösteriyoruz.

            private void btnGuncellenmisleriListele_Click(object sender, EventArgs e)
            {
                  dataGridView1.DataSource = s.GetChanges(MyCollection<SampleEntity>.ObjectStates.Updated);
            }

         Update edilmiş verileri göstenin yeni eklenmiş verileri göstermekten tek farkı Collection'ımızın GetChanges metoduna parametre olarak OjectState'i Updated olarak belirlemektir.

            private void btnSil_Click(object sender, EventArgs e)
            {
                  s.Remove(s[0]);
                  dataGridView1.DataSource = null;
                  dataGridView1.DataSource = s;
            }

          Sil buttonunun Click Event'ında ise Collectionumzun Remove metodunu kullanarak collectionda bulunan ilk nesneyi siliyoruz.

            private void btnSilinmisleriListele_Click(object sender, EventArgs e)
            {
                  dataGridView1.DataSource = s.GetChanges(MyCollection<SampleEntity>.ObjectStates.Deleted);
            }

         Silinmiş neneleri listelemek için kullanacağımız metod Update edilmiş nesneleri ve yeni eklenmiş nesneleri listelerken kullandığımız metodun aynısıdır. Bu sefer sizlerinde tahmin edeceği gibi Collectionumuzun bu metoduna parametre olarak ObjectState'i Deleted veriyoruz. ve ize silinmiş veriler geliyor.

            private void btnOrjinalleriListele_Click(object sender, EventArgs e)
            {
                  dataGridView1.DataSource = s.GetChanges(MyCollection<SampleEntity>.ObjectStates.Orginal);
            }

         Üzerinde hiç değişiklik yapılmamış nesneleri görüntülemek için aynı metodu ObjectState.Orginal parametresi ile çağırıyoruz ve bize üzerinde değişiklik yapılmamış olan nesneler metod tarafından döndürülüyor.

            private void btnDegisiklikleriKabulEt_Click(object sender, EventArgs e)
            {
                  s.AcceptChanges();
                  dataGridView1.DataSource = null;
                  dataGridView1.DataSource = s;
            }

         Değişiklikleri kabul etmek için collectionumuzun AcceptChanges metodunu kullanmamız mümkündür. Bu metod collectiondaki bütün nesnelerin State'lerini Orginal'a çevirir. Bunu nasıl yaptığını MyCollection Base class'ını yazarken açıklamıştık.

            private void btnDegisiklikleriGeriAl_Click(object sender, EventArgs e)
            {
                  s.RejectChanges();
                  dataGridView1.DataSource = null;
                  dataGridView1.DataSource = s;
            }                       
      }
}

          Değişiklikleri geri al butonunu ise Collectionumuzun durumunu en son AcceptChanges yaptığımız duruma çevirmek için kullanabiliriz. Bu metodu bir nevi kaydedilmemiş(AcceptChanges) değişikliklerin geri alınması gibi düşünebiliriz. Bu metod çalışırken Collectionda bulunan nesnelerimizin State'ine göre çalışmaktadır.

          Bu makalede gerçekten faydalı olduğuna inandığım bir örneği beraer yaptık. Bu örnekte dikkatimizi çeken eksiklikler Windows uygulamalarının büyük bir avantajı olan DataGrid'den direkt veri girişi, silinmesi veya güncelleme işlemlerinin yapılmasıdır. Ancak collectionumuzun bunu desteklemediğini gördük. Bundan dolayı ileride yazacağım makalelerin konusu bu özelliğin Base Collection'umuza nasıl katılacağıdır. Daha sonrasında ise Collection'u serileştirilebilir yapmakla ve DataTable'ın Select metoduna benzer bir metod sayesinde sorgu yapabilme ve Sorting yapabilme ile ilgili özellikleri geliştirmeye çalışacağız.

Tamer ÖZ

oztamer@hotmail.com
tamer.oz@yazgelistir.com
oztamer@hotmail.com

 

Ozel Bir Collection I - Kolay Veri Doldurma

Ozel Bir Collection II - Verinin State'ini Tutmak

Ornek Kodlar