Anasayfa / Yazılım / C# / Öğrenci Otomasyonu Bölüm 4

Öğrenci Otomasyonu Bölüm 4

Şimdi ne demiştik, öncelikle bu yeni açılacak form veritabanı ile bağlantı kuracak ve form üzerinde yer alan Bölüm seçildiğinde bu bölüme denk gelen öğrenci kayıtları listelenecek bu listeleme işlemini de ikinci combobox üzerinde gerçekleştirilecek. Yani TC kimlik noları barındıran combobox veritabanından doldurulacak. O halde ben bölümlerin listelendiği cmbBolum combobox’ın TextChanged olayına aşağıdaki kodu yazıyorum.

Kod içerisinde açıklama yapacağım ancak yine de ön bir açıklama yapalım. Kodlarımda OleDbCommand nesnesi ile veri seçme işlemi yapacağım. OleDbCommand ingilizcesi Object Linking and Embeding Database Command anlamındadır yani nesne bağlama ve veritabanına ekleme, katma anlamındadır. Birde OleDbDataReader nesnemiz mevcut bununla da verileri okuyabiliyoruz. SQL ortamında sorgu yazarken seçmek istediğimiz verinin koşulunu ise WHERE deyimi ile belirtiyoruz. Şimdi benim uygulamam da iki tane koşulum mevcut, işte bunu AND ifadesi ile gerçekleştiriyorum. Şimdi kodlara geçelim.

private void cmbBolumListe_TextChanged(object sender, EventArgs e)
        {
            //Aşağıdaki satır ile veritabanı bağlantımı gerçekleştiriyorumç
            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + Application.StartupPath + ("/OgrenciOtomasyonu.accdb"));
            //Bağlantımı açıyorum.
            conn.Open();

            //OgrenciBilgiler tablosunda seçilen bölüm altında kayıtlı olan ama Notlar tablosunda kaydı bulunmayan TC Kimlik numaralarını veri tabanından okuyorum.
            OleDbCommand query = new OleDbCommand("SELECT TC_Kimlik_No, Bolum FROM OgrenciBilgiler WHERE TC_Kimlik_No NOT IN (SELECT TC_Kimlik_No FROM OgrenciNotlar) AND Bolum=" + "'" + cmbBolumListe.Text + "'", conn);
            //Üstteki sorgum sonucu gelen verileri aşağıdaki OleDbDataReader nesnesi ile okuyorum.
            OleDbDataReader dr = query.ExecuteReader();

            while (dr.Read())
            {
                //Sorgum sonucu elde ettiğim TC Kimlik numaralarını  TC Kimlik No Combobox kontrolüme ekliyorum.
                cmbTCKimlikNoListe.Items.Add(dr["TC_Kimlik_No"]);
            }

            dr.Close();
            //Sorguyu serbest bırakıyorum
            query.Dispose();
            //Bağlantımı kapatıyorum
            conn.Close();
        }

TC Kimlik Noları combobox içine ekledik. Şimdi bu veriler geldikten sonra herhangi bir TC Kişmlik no seçildikten sonra da form üzerinde öğrencinin adı ve soyadı otomatik olarak veritabanından gelecek dedik. Bunu yapabilmek için de TC Kimlik No gösteren comboboxın TextChanged eventine aşağıdaki kodları yazalım. Şimdi OgrenciBilgileri tablosundan Ad Soyad verilerini çekeceğiz, buradaki koşulumuz TC Kimlik No comboboxında yer alan değer ile TC Kimlik numarasının eşit olmasıdır. Bu nedenden dolayı cmbTcKimlikNo kontrolünün text özelliğini aşağıdaki kodlarda çift tırnak arasına aldım. Şimdi kodlara geçelim:

private void cmbTCKimlikNoListe_TextChanged(object sender, EventArgs e)
        {
            //Bağlantımı açıyorum, ama bu sefer bağlantı oluşturma connection stringimi yukarıda ayrıca yazdım.
            conn.Open();

            //Combobox üzerinden seçilen TC Kimlik Numarasına göre kayda karşılık gelen ad ve soyad bilgisini OgrenciBilgiler tablosundan çekeceğiz.
            OleDbCommand query = new OleDbCommand("SELECT AdSoyad FROM OgrenciBilgiler WHERE TC_Kimlik_No = " + "'" + cmbTCKimlikNoListe.Text + "'", conn);
            //Üstteki sorgum sonucu gelen verileri aşağıdaki OleDbDataReader nesnesi ile okuyorum.
            OleDbDataReader dr = query.ExecuteReader();
            if (dr.Read())
            {
                //Sorgudan elde edilen ad ve soyad bilgilerini ilgili labela yazıyorum.
                lblAdSoyad.Text = dr["AdSoyad"].ToString();
            }
            //Sorguyu serbest bırakıyorum
            query.Dispose();
            //Bağlantı kapatıyorum
            conn.Close();
        }

Şimdi sıra geldi, Vize ve Final notlarını textbox içlerine yazarak Kaydet butonuna basıldığında not ortalamasını hesaplamaya ve bu hesap sonucunu da lblOrtalama labelinin text özelliğine yazmaya. Bu işlemleri yapabilmek içinde Kaydet butonunun click eventine aşağıdaki kodları yazacağız. Kod bloğu içince açıklama yaptım ama ön açıklama da yapmak istiyorum. Şimdi bu kodlar içinde kullanmış olduğum if else blokları ile öncelikle not alanlarının boş geçilmesini önlüyorum. Vize veya Final notlarından birisi ya da her ikisi boş geçilirse kullanıcıya uyarı mesajı verilecek. Boş geçmeyiniz diye. Aynı şekilde vize ve final notları her ikisi ya da biri 100’den fazla olmaması gerekiyor, bunu da if else ile kontrol ediyorum. Hatalı giriş yapılırsa yine kullanıcıyı uyaracağım. Not ortalaması hesabım ise şu şekilde. Vizenin % 30’u, finalin %70’i olacak. Bu iki notu toplayacağım ve lblOrtalama labelinin Text özelliğine yazacağım. Tabi bunları aynı zamanda veritabanıma da kaydetmem gerekiyor, bunun içinde OleDbCommand nesnesinden bir sınıf oluşturacağım. Adını aşağıda göreceğiniz üzere NotKaydet verdim. Buradaki formdaki verileri veritabanımda ilgili tabloma OgrenciNotlar tabloma INSERT INTO komutu ile atacağım. Dolayısı ile form üzerinde yer alan TC Kimlik No alanına göre Vize, Final ve Ortalama bilgisi OgrenciNotlar tablosuna eklenecek. Notlar başarılı bir şekilde eklendikten sonra kullanıcıya mesaj vermem gerekiyor, işlem tamamlandı, notlar eklenmiştir gibisinden bir mesaj. Tabi tüm eklemeler tamamlandıktan sonra form üzerindeki kontrollerin içeriğini sıfırlayalım ki, bir sonraki kayıt için kolaylık olsun. Şimdi kodlara geçelim:

private void btnKaydet_Click(object sender, EventArgs e)
        {
            //Değişkenlerimi tanımladım.
            int VizeNotu, FinalNotu;
            //Ortalamam kesirli bir sayı çıkabilir, dolayısı ile float olarak tanımladım.
            float Ortalama;
            //vize ve/veya final notlarının boş geçilmesi durumunda kullanıcıy uyarıyorum, işlem yapmıyorum.
            if (msktxtVize.Text == "" || msktxtFinal.Text == "")
            {
                MessageBox.Show("Vize notu ve/veya final notu alanları boş geçilemez! Lütfen ilgili alanları doldurunuz.");
            }
                //Bir problem yoksa aşağıdan devam ediyorum.
            else
            {
                //Masked textboxlardaki veriler string tipinde dolayısı ile bunların integer yapıyorum ki üzerinde işlem yapabileyim.
                VizeNotu = Convert.ToInt32(msktxtVize.Text);
                FinalNotu = Convert.ToInt32(msktxtFinal.Text);
                //Eğer bu girilen notlardan vize ve/veya final notu 100'den fazla girildi ise kullanıcıyı tekrar uyarıyorum.
                if (VizeNotu > 100 || FinalNotu > 100)
                {
                    MessageBox.Show("Vize notu ve/veya final notu 100'den fazla olamaz! Gerekli düzenlemeyi yapınız");
                }
                    //Notlarda sorun yok ise aşağıdaki kodlarla devam ediyorum.
                else
                {
                    //Ortalamamı hesaplıyorum, bulduğum sonucu ilgili labela yazıyorum.
                    Ortalama = (VizeNotu * 0.3F) + (FinalNotu * 0.7F);
                    lblOrtalama.Text = Ortalama.ToString();
                    //Bağlantımı açıyorum. Daha önceden bu connection stringimi yazmıştım, buna dikkat edin.
                    conn.Open();
                    //OleDbCommand nesnem üzerinden yeni bir sınıf oluşturarak form üzerindeki verileri vertabanıma aktarıyorum. 
                    OleDbCommand NotKaydet = new OleDbCommand("INSERT INTO OgrenciNotlar (TC_Kimlik_No, Vize, Final, Ortalama) VALUES('" + cmbTCKimlikNoListe.Text + "','" + msktxtVize.Text + "','" + msktxtFinal.Text + "','" + lblOrtalama.Text + "')",conn);
                    NotKaydet.ExecuteNonQuery();
                    //veri aktarma işleminin tamamlandığını kullanıcıya bildiriyorum.
                    MessageBox.Show("Notlar veritabanına aktarılmıştır","Not Ekleme",MessageBoxButtons.OK, MessageBoxIcon.Information);
                    //Sınıfı serbest bırakıyorum, bağlantımı kapatıyorum.
                    NotKaydet.Dispose();
                    conn.Close();
                    //İlgili alanları sıfırlıyorum.
                    cmbTCKimlikNoListe.Items.RemoveAt(cmbTCKimlikNoListe.SelectedIndex);
                    msktxtFinal.Text = "";
                    msktxtVize.Text = "";
                    lblOrtalama.Text = "";
                    lblAdSoyad.Text = "";
                }

            }
        }

Şimdi gelelim kayıtları listelemeye. İlk açılan formumda yer alan kayıtları listele butonuna bastığımda veritabanında yer alan tüm kayıtları listeleyeceğim. Tabi ben veritabanımda iki tablo kullandım ve bu iki tablo birbiri ile ilişkili. TC Kimlik No, Ad Soyad bilgileri OgrenciBilgiler tablosundan, vize, final ve ortalama bilgileri ise OgrenciNotlar tablosundan gelecek. Şimdi gelelim buradaki tasarımımıza. Yeni bir form oluşturuyorum, projemin adına sağ tıkladım add deyip oradan windows form seçiyorum adını da frmKayitlariListele verdim. Formun Text özelliğini Kayıt Listeleme verdim, BackColor rengini de Highlight ettim. Birazda boyutunu da büyütüyorum.

Şimdi ben bu form üzerinde kayıtları listelemek için bir data komponent kullanmalıyım. Bunun içinde DataGridView kullanacağım. Toolbox üzerinden bir DataGridView’i formumun üzerine sürüklüyorum. Şimdi bu kontrolüm seçili iken üst sağda yer alan ufak ok tuşuna basıyorum ve burada Data Source seçeneğini none olarak seçiyorum. Daha sonra kontrolde listelenen verileri buradan düzenlemek istemediğim için Enable Editing seçeneğindeki ticki kaldırıyorum. Aşağıda yaptığım ayarları da resmettim.

2015050312

Şimdi geliyoruz kodlamaya, bu verilerin burada listelenebilmesi için OleDbDataAdapter nesnesini kullanacağım. Ama bunu bir sonraki yazıya bırakıyorum. Projede şu ana kadar gelinen aşamayı aşağıdaki linkden indirebilirsiniz.

2 yorum

  1. Bunu böyle değilde atıyorum bağlantı için bir sınıf tanımlayıp diğer sayfalardan bu bağlantıyı kullanacak şekilde yani daha profesyonelce hazırlasaydınız daha iyi olacaktı hiç bilmeyenler için iyi 🙂

  2. Burada amaç çok giriş seviyesindeki arkadaşlarımız 🙂 Yorumunuz için teşekkür ederim 🙂

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir