12 Nisan 2013 Cuma

Türkçe - İngilizce Sözlük...

Bu programda bir sözlük yapacağız... Türkçe ve İngilizce kelimelerin anlamlarını gösteren bir sözlük tasarımımız olacak... Veri tabanı proje örneklerinden birisi olan sözlüğümüz çok daha fazla geliştirilebilir... 

Birden fazla form üzerinde tasarladığımız programımızda aşağıdaki seçenekler olacak...

1. Form içerisinde Türkçe yazılan bir kelimenin İngilizce anlamını veya tersini göstereceğiz...

2. Formumuzda yeni kelime kayıtları yaptıracağız... 

3. Formumuzda aranan harfle başlayan bütün kelimeleri göstereceğiz... 

4. Formda ise kayıt silme işlemi yapacağız...

5. Formda basit bir kelime oyunu yapacağız...

6. Formda kelime düzenleme ile ilgili bir ayarlama yapacağız...

Şimdi projemizi sırası ile anlatmaya başlayalım...

Önce veritabanından bahsedelim... Access veritabanı kullanacağız ve veritabanımızın ismi "Veritabanı1" olacaktır... Tablo1 tablomuzun ismi olacaktır... Tasarım kısmı aşağıdaki resimdeki gibi olacaktır... 

Tablo1 de veri tasarım kısmında ise aşağıdaki gibi verileri giriniz...

Acces veritabanın da yapacağımız ayarlar sadece bu kadar... Program kısmında ise aşağıdaki gibi form tasarımını gerçekleştireceğiz... Sonuç işleminin olduğu kısımda da bir label olacaktır...

Burada bulunan form elemanları aşağıdaki gibidir;
Ara - Button1
Sil -  Button4
Kayıt - Button2
Harfler - Button3

Kelime Girişi - Textbox2
Kelime Sonucu - Label3

Türkçe İngilizce - RadioButton1
İngilizce Türkçe - RadioButton2 

şeklinde önemli olanları sıralayabiliriz... Bu isimleri verdim, çünkü kod kısmında karşımıza çıkacaktır... Şimdi ilk form sayfamızdaki kodlara bakalım... 

FORM1 Kodlar...

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // Access veritabanı bağlantımızı yapıyoruz... 
        OleDbConnection baglanti = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Veritabanı1.accdb");
        OleDbCommand komut = new OleDbCommand();
        OleDbDataAdapter da;
        DataSet ds = new DataSet();

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox2.Enabled = false;
            label3.Enabled = false;

            // Programın açılışında bütün kelimeler datagridview e gelecektir...
            komut.CommandText = "SELECT *  FROM Tablo1";
            komut.Connection = baglanti;

            da = new OleDbDataAdapter(komut);         
            da.Fill(ds, "tablo");
            dataGridView1.DataSource = ds;
            dataGridView1.DataMember = "tablo";
        }   
            
        private void button1_Click(object sender, EventArgs e)
        { 
            // Ara butonunun olduğu kısım... 

            string aranan = textBox2.Text;// Girilen kelimeyi alıyoruz...
            bool kelimeyok = true; // Bu değişkeni, aradığımız kelime yoksa kullanacağız...

            if (textBox2.Text != "")
            {
                baglanti.Open(); // Bağlantılarımızı açıp, tablomuzu çağırıyoruz... 
                komut.CommandText = " Select * From Tablo1";
                komut.Connection = baglanti;
                OleDbDataReader oku = komut.ExecuteReader();

                if (radioButton1.Checked) // Türkçe seçili ise bu kısım çalışacaktır...
                {
                    while (oku.Read())
                    {
                        if (aranan == oku[0].ToString()) //Aranan kelimeyi veritabanınındaki tablonun ilk sütununda arıyoruz...
                        {
                            label3.Text = oku[1].ToString(); // Sonucu gösteriyoruz... 
                            kelimeyok = false; // Aradığımız kelimeyi bulursak bunu false yapıyoruz ki en sondaki if şartına takılmayalım... 
                        }
                    }
                }

                if (radioButton2.Checked) // İngilizce seçili ise bu kısım çalışacaktır...
                {
                    while (oku.Read())
                    {
                        if (aranan == oku[1].ToString()) //Aranan kelimeyi veritabanınındaki tablonun ikinci sütununda arıyoruz...
                        {
                            label3.Text = oku[0].ToString();
                            kelimeyok = false;
                        }
                    }
                }

                oku.Close(); // Bağlantıları kapatıyoruz... 
                baglanti.Close();

                if (kelimeyok)
                    MessageBox.Show("Aradığınız kelime bulunmamaktadır...");
            }
            else
                MessageBox.Show("Lütfen değer girdikten sonra ara butonuna basınız...");
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            // Türkçe butonu seçili ise label3 ve textbox2 aktif olacaktır...
            textBox2.Enabled = true;
            label3.Enabled = true;
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            // İngilizce butonu seçili ise label3 ve textbox2 aktif olacaktır...
            textBox2.Enabled = true;
            label3.Enabled = true;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            // Silme kısmına geçiyor...
            Form4 frm4 = new Form4();
            frm4.Show();
            this.Hide();
        }    

        private void button2_Click(object sender, EventArgs e)
        {
            // Kelime kayıt kısmına geçiyor...
            Form3 frm3 = new Form3();
            frm3.Show();
            this.Hide();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // Harf sıralaması kısmına geçiyor...
            Form2 frm2 = new Form2();
            frm2.Show();
            this.Hide();
        }
    }
}

Form1 de yaptığımız tasarım ile birlikte öncelikle sayfaya Access veri tabanındaki bütün kelimeler anlamları ile birlikte gelmektedir... İstenildiği takdirde kullanıcı buradan kelime anlamlarına bakabilir... Radiobutton ile çevirme seçeneği seçildikten sonra, kelime textbox ın içine girdiriliyor... Ara butonu ile birliktede arama yaptırılıp sonuç gösteriliyor... 

Radiobuttondan yapılan seçime göre eğer Türkçe seçilirse veritabanından oku[0], ingilizce seçilirse veritabanından oku[1] sorgulanıyor... 

aranan == oku[0].ToString();

Diğer form sayfalarına geçmek için aşağıdaki sabit yapıyı kullanıyoruz... Sadece hangi forma geçmek istiyorsak onu çağırıyoruz... Geçiş işlemi sırasında bir önceki formu gizlemek için Hide, yeni formu göstermek için Show() komutlarını kullanıyoruz... 

Form3 frm3 = new Form3();
frm3.Show();
this.Hide();

Arama kısmında aranan kelimenin veritabanın da olmaması durumunda kelimeyok isimli değişkenimizi kullanıyoruz... Kelimeyok isimli değişkenimiz bool türündedir... Bu değişkenimiz veritabanın da yapılan aramada her hangi bir sonuç yoksa false değerini alacaktır ve aşağıdaki satır ile hata verecektir...

if (kelimeyok)
                    MessageBox.Show("Aradığınız kelime bulunmamaktadır...");


Şimdi Form2 ye, yani harflere göre listeleme yaptığımız tasarım kısmına geçelim... Form 2 nin tasarımı aşağıdaki gibi olacaktır...


Harf gir kısmına bir tane harf gireceğiz... Ara butonuna tıklandıktan sonra girilen harf ile başlayan bütün kelimeleri ekranda gösterecektir... Form2 nin çalışır hali aşağıdaki gibi olacaktır...

FORM2 Kodlar...

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

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

OleDbConnection baglanti = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Veritabanı1.accdb");
        OleDbCommand komut = new OleDbCommand();
        OleDbDataAdapter da;
        DataSet ds = new DataSet();

        private void button1_Click(object sender, EventArgs e)
        {
           ds.Clear();  // datagridview i dolduran tabloyu siliyor... 
                        // Bu olmadığı takdirde datagrid temizlenmiyor ve eski harfide tabloda gösteriyor...
                        
            // Textbox1 in  properties penceresindeki max lenght özelliğini 1 yapıyoruz... 
            // Bu sayede sadece 1 karakter giriş yapabiliyoruz...

            baglanti.Open();
            // % ifadesi ile devamını kendisi dolduruyor... 
         // Örneğin a% yapınca a harfi ile başlayan bütün harfleri, aba% olursa aba ile başlayan bütün kelimeleri aratıyoruz...
            komut.CommandText =  "SELECT * FROM Tablo1 WHERE [TÜRKÇE] LIKE '"+textBox1.Text+"%'";
            komut.Connection = baglanti;
            da = new OleDbDataAdapter(komut);
            da.Fill(ds, "tablo");
            dataGridView1.DataSource = ds;
            dataGridView1.DataMember = "tablo";
            baglanti.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form1 frm1 = new Form1();
            frm1.Show();
            this.Hide();
        }
    }
}

Yukarıdaki komut satırlarında ilk dikkat etmemiz gereken kısım aşağıdaki kodlardır;

komut.CommandText =  "SELECT * FROM Tablo1 WHERE [TÜRKÇE] LIKE '"+textBox1.Text+"%'";


Bu kod satırında kullanılan Like ifadesi verilen alan içerisinde istediğimiz harf ile başlayan değerleri bulduruyor... Program tasarım kısmında textbox1 in maxlenght özelliğini 1 yaptığımız için sadece tek karakter değer girdirmemize izin veriyordu... Bu sebeple girilen tek karakteri alıp veritabanı dosyamızda kontrolümüzü yaptırıyoruz... 


Bir diğer dikkat edeceğimiz hususta ds.Clear() komutudur... Ekranda değerleri göstermek için datagridview kullanıyoruz ve her harf seçtiğimizde bir önceki harf verilerini göstermemesi için datagridviewi temizliyoruz... Bunu ise vermiş olduğumuz dataset türündeki değişkenimiz olan ds ile yapıyoruz... 



Sıra Form3 ün tasarımında... Tasarım ekranı aşağıdaki gibi olacaktır... Veri kaydedeceğimiz bir tasarım ekranı oluşturmuş olacağız... 


Örnek olarak yukarıdaki veriler gibi bir bilgi girişi yaptığımızda veritabanına bu bilgileri kaydedecektir... 


Peki Form3 ün kod kısmında neler var... Aslında Form3'ün kod kısmı çok kısa... Çünkü sadece  bir kayıt işlemi yapılmakta... Aşağıda kullanılan kodlar gösterilmektedir...

FORM3 Kodlar...

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

namespace WindowsFormsApplication1
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        OleDbConnection baglanti = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Veritabanı1.accdb");
        OleDbCommand komut = new OleDbCommand();

        private void button1_Click(object sender, EventArgs e)
        {
            komut.CommandText = "insert into Tablo1 values('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "')";
            komut.Connection = baglanti;
            baglanti.Open();
            komut.ExecuteNonQuery();
            baglanti.Close();
            MessageBox.Show("Kayıt Eklendi");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Form1 frm1 = new Form1();
            frm1.Show();
            this.Hide();
        }
        }
    }

Burada daha önceki bilgilere ek her hangi bir farklı uygulama yoktur... 

Aynı kaydetme işlemimiz gibi olan bir de Form4 tasarım kısmımız var... Silme işlemi için kullandığımız bir kısım burası... Form tasarımı aşağıdaki gibi olacaktır... 

FORM4 Kodlar...

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

namespace WindowsFormsApplication1
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }
        OleDbConnection baglanti = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Veritabanı1.accdb");
        OleDbCommand komut = new OleDbCommand();
        private void Form4_Load(object sender, EventArgs e)
        {
            textBox1.Enabled = false; // dil seçimi yapılmadan her hangi bir kelime girişine izin verilmiyor... 
            textBox2.Enabled = false;
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton1.Checked)
            {
                textBox1.Enabled = true; // Türkçe kelime giriş kısmı açılıyor...
                textBox2.Enabled = false;
            }
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            if (radioButton2.Checked)
            {
                textBox2.Enabled = true; // İngilizce kelime giriş kısmı açılıyor... 
                textBox1.Enabled = false;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (radioButton1.Checked)
            {
                // Türkçe alanına göre arattırma yapıp veriyi siliyor... 
                komut.CommandText = "Delete From Tablo1 where [TÜRKÇE]=('" + textBox1.Text + "')";
            }
            else if (radioButton2.Checked)
            {
                // İngilizce alanına göre arattırma yapıp veriyi siliyor... 
                komut.CommandText = "Delete From Tablo1 where [İNGİLİZCE]=('" + textBox2.Text + "')";
            }

                komut.Connection = baglanti;
                baglanti.Open();
                komut.ExecuteNonQuery();
                baglanti.Close();
                MessageBox.Show("Kayıt Silindi");
            
        }

        private void button2_Click(object sender, EventArgs e)
        {
        //Anasayfaya geri dönüş yaptırıyor... 
            Form1 frm1 = new Form1();
            frm1.Show();
            this.Hide();
        }
    }
}

Bir veriyi veritabanından silerken tek bir değer yeterli olmaktadır... Örneğin Türkçe alanından bir bilgi girildiğinde veri tabanında o bilginin olduğu bütün satır silinmektedir... Bu sebeple giriş işlemlerinde sadece bir veri almamız yeterli olacaktır... 

Seçim işlemi için kullanıcıya tercih sunulmaktadır... Kullanıcının seçeceği dile göre silme işlemi yapılmakta ve veritabanı güncellenmektedir... 

Form 5 uygulamaya daha sonradan eklenmiştir... Onun için ilk anasayfa gösteriminde yoktur... Bu butonu ana sayfaya ekleyiniz... Form 5 ile birlikte basit bir bilgi oyunu yapmış olduk... Kullanıcıya ingilizce kelimeyi sorup, Türkçe anlamını yazmasını istiyoruz... 

Form 5 ile birlikte veritabanımızda ufak bir değişiklik yapıyoruz... Id adında bir alan ekliyoruz... Aşağıdaki resimde gözüktüğü gibi...
Buradaki id yi otomatik sayı olarak tanımlıyoruz... Form 5 form tasarımını ise aşağıdaki gibi yapıyoruz... 

Form çalıştığında rastgele veritabanından bir sözcük gelecektir... Bu sözcüğün Türkçe karşılığını girmemizi isteyecektir.... 

Kullanıcıya 5 hak veriyoruz... Her yanlış veya doğru bildiğinde yeni bir kelime ile oyuna devam ediyor... Daha bir çok ekleme yapılabilir... Örneğin; yanlış girilen cevapları bittikten sonra gösterilebilir, doğru cevap sayısından bir puanlama yapılabilir ve bu veritabanına kaydedilip en yüksek üç puan gösterilebilir, yada test tarzında bir soru şekline dönüştürülebilir gibi... Peki bu uygulamamızda ki kodlarımız nasıl olacaktır... 

Form 5 Kodlar...

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

namespace WindowsFormsApplication1
{
    public partial class Form5 : Form
    {
        public Form5()
        {
            InitializeComponent();
        }

        OleDbConnection baglanti = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Veritabanı1.accdb");
        OleDbCommand komut = new OleDbCommand();

        string tut = ""; // cevabı tuttuğumuz değişkenimiz... 
        int adet = 0; // Yanlış cevap için hak verdiğimiz değişenimiz... 

        private void button1_Click(object sender, EventArgs e)
        {
            Form1 frm1 = new Form1(); // ana sayfaya geri dönüyoruz... 
            frm1.Show();
            this.Hide();
        }

        void yenikelime() // kelime getiren metodumuz... 
        {
            tut = "";
            Random rnd=new Random();
            int RastgeleSayi1 = rnd.Next(10, 101);
            MessageBox.Show(RastgeleSayi1.ToString()); // Veritabanında id numaralarını alabilmek için rastgele bir atama yapıyoruz... 

            baglanti.Open(); 
            komut.CommandText = " Select [turkce],[ingilizce] From Tablo1 where [id]="+ RastgeleSayi1; // id ye göre sözcüğü getiriyoruz... 
            komut.Connection = baglanti; 
            OleDbDataReader oku = komut.ExecuteReader(); 

            while (oku.Read())
            {
                label1.Text = oku[1].ToString(); // ingilizce anlamını label a yazıyoruz...
                tut = oku[0].ToString(); // türkçe anlamını kullanıcının göremeyeceği bir değişkende tutuyoruz... 
            }
            
            oku.Close();         
            baglanti.Close();
        }

        private void Form5_Load(object sender, EventArgs e)
        {
            yenikelime();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (tut == textBox1.Text) // cevap doğru ise mesaj verdiyoruz... 
            {
                MessageBox.Show("Doğru Bildiniz...");
                yenikelime();
                textBox1.Text = "";
            }
            else
            {
                adet++; // yanlış ise haklardan bir tanesi gidiyor... 
                MessageBox.Show("Tekrar Gir..." + adet + " hakkınızı kullandınız...");
                yenikelime();
                textBox1.Text = "";
            }

            if (adet >= 5) // yanlış sayısı 5 olduğunda program oyun bitiyor... 
            {
                MessageBox.Show("Kaybettiniz...");
                Application.Exit();
            }
        }
    }
}

Aynı Form5 gibi Form 6 da daha sonradan eklenmiştir... Bu sebeple ana sayfaya bir tanede düzenle butonu ekleyiniz... Form 6 da yapacağımız kısım ise kelimelerde düzenlenmesi gerekenler için bir tasarım gerçekleştirmektir... 

Burada Update komutunu kullanacağız... Her güncellemeden sonra datagridview de güncel halini göstereceğiz...

Yalnız burada bir eksiğimiz var... O da güncelleme yaparken aynı kelimeyi veya aynı id numarasını tekrar girdirmemiz lazım... Bu sebeple bir kontrol yapıldıktan sonra düzenleme yapsak daha iyi bir sonuç alabilirdik...

Form 6 nın tasarımı aşağıdaki gibi olacaktır...

Buradaki kaydet butonu aslında güncelleme yapan butonumuzdur... Güncelleme için kelimeyi datagridviewden tıkladığımız anda, textboxlara bilgiler otomatik dolmaktadır... 

Textboxlarda değişiklik yaptıktan sonra kaydet butonuna bastığımız anda da işlemleri veri tabanına kayıt etmektedir... 

Burada datagridview in üzerine tıklandığını dataGridView1_CellClick olayı ile algılatıyoruz... Bu olayı kodları yazarken properties kısmından özellikle çağırınız... Çünkü datagridview üzerine çift tıklandığında kod kısmına geçerken dataGridView1_CellContentClick olayını getirmektedir... Bu bizim istediğimiz sonucu vermiyor ne yazıkki... Bu sebeple cellclick olayını kullanıyoruz... 

Form 6 Kodlar...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace WindowsFormsApplication1
{
    public partial class Form6 : Form
    {
        public Form6()
        {
            InitializeComponent();
        }
        
        OleDbConnection baglanti = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Veritabanı1.accdb");
        OleDbCommand komut = new OleDbCommand();

        DataSet ds;

        public void yukle()
        {
            
            //adaptor isminde bir OledbDataAdaptor nesnesi oluşturdum ve select sorgusu ile veritabanındaki kayıtları adaptor nesnesine aktardım.
            OleDbDataAdapter adaptor = new OleDbDataAdapter("Select * from tablo1", baglanti);
           
            //Daha sonra bir dataset nesnesi oluşturdum.Dataseti veritabanındaki kayıtları DataGridView'de göstermek için kullanıyoruz.
            ds = new DataSet();
            
            //Datasetimizin içini temizledik.
            ds.Clear();
            
            //adaptor nesnesindeki verileri datasete aktardık.
            adaptor.Fill(ds, "tablo1");
            
            //Datasetteki verileri datagridviewe aktardık.
            dataGridView1.DataSource = ds.Tables["tablo1"];
            adaptor.Dispose();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            // Sorgu cümlesini oluşturuyoruz... 
            string sorgu = "update Tablo1 set turkce='" + textBox1.Text + "',ingilizce='" + textBox2.Text + "',turkceanlam='" + textBox3.Text + "' where [id]="+textBox4.Text;
        
            // Veritabanımız ile sorgu cümlesini birbirine bağlıyoruz... 
            OleDbCommand komut = new OleDbCommand(sorgu,baglanti);

            baglanti.Open();
            komut.ExecuteNonQuery();
            baglanti.Close();
            
            // Bütün işlemlerden sonra güncel hali ile datagridview i tekrar dolduruyoruz... 
            yukle();
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //Textbox'ları datagridview'deki alanlara eşitledik
            int satir;
            satir = dataGridView1.CurrentRow.Index;// Seçili olan satırın numarasını alıyoruz...

            // seçili olan satıra ait bütün hücrelerdeki değerleri doğru yerlerine yerleştiriyoruz... 
            textBox1.Text = dataGridView1.Rows[satir].Cells[0].Value.ToString();
            textBox2.Text = dataGridView1.Rows[satir].Cells[1].Value.ToString();
            textBox3.Text = dataGridView1.Rows[satir].Cells[2].Value.ToString();
            textBox4.Text = dataGridView1.Rows[satir].Cells[3].Value.ToString();
        }

        private void Form6_Load(object sender, EventArgs e)
        {
            yukle();// datagridview i dolduruyoruz... 
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1 frm1 = new Form1(); // ana sayfaya dönüş...
            frm1.Show();
            this.Hide();
        }

    }
}


Bu form ile birlikte programımızı bitiriyoruz... Çok geniş açıklamaların olduğu ve bir çok komut hakkında bilgi sahibi olunabilecek bir uygulama tasarımı gerçekleştirmiş olduk... İyi incelenirse güzel sonuçlar çıkarılabilecektir...