22 Mart 2014 Cumartesi

Veritabanı Ders Uygulamaları - 4

Uygulamamızın konusu garanti süresi devam eden ürünleri bulmak... Bunun için garanti süresini, giriş tarihine ekleyip şimdiki zaman ile kıyaslamamız gerekiyor... 

Örneğin 2012 yılında alınan bir harddiskin eğer 2 yıl garanti süresi var ise 2012+2 = 2014 yılına kadar garantisi devam ediyor demektir... Biz bunu Sql sorgusu ile hesaplayıp, datagridview de göstereceğiz... 

Bu işlemi yaparken de Combo kutusundan yapılan seçimlere göre yaptıracağız... Yaptığımız seçime göre stokta olanlar, garantisi devam edenler ve eldeki bütün ürünleri göstereceğiz... Combo içerisine Hepsi, Garanti ve Stok eklemelerini yapalım...

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















Veritabanı tasarımı aşağıdaki gibi olacaktır... Bu tabloyu daha önceden kullandık...









Program çalıştığı zaman aşağıdaki gibi bir ekran gelecektir...














Burada yukarıda yapılan seçimlere göre sırası ile istenilen bilgiler gelecektir... Programın kod kısmına geçelim...

1 - Baglanti, komut, da ve ds değişkenlerimizi daha önceki örneklerdeki gibi tanımlayınız...

2 - doldurdatagrid adında bir metod tanımlayacağız... Bu metod ile datagridviewimize bilgileri getireceğiz... Bunun için void doldurdatagrid(string sorgu) şeklinde metodu tanımlayınız...

3 - Bu metodun girişinde ds.Clear(); komutu ile bir önceki tablo bilgilerini silelim...

4 - Bu metodun içerisindeki komutları tamamlayalım ve datagridviewde bütün tablo program açıldığı zaman gözüksün... Yalnız Kimlik ve Kalan alanlarındaki bilgiler gizli olsun... Program çalıştığında gösterilmesin...

5 - Diğer komutlarımızı comboBox1_SelectedIndexChanged olayının içerisine yazacağız...Üç ihtimal var... Aşağıdakine gibi bir şart kullanacağız...
if (comboBox1.Text == "Garanti") // Garanti süresi devam edenler
  doldurdatagrid("Select *  From Stok Where DateAdd('yyyy',[Garanti],[Alınan Tarih])>Now()  And [Kalan]<>0");
else if (comboBox1.Text == "Hepsi") // Stokta olan ve olmayan hepsi gözüküyor...
    doldurdatagrid(// Burayı siz tamamlayınız...);
else if (comboBox1.Text == "Stok") // Stokta olan ürünler gösteriliyor... Kalan alanına bakmamız gerekiyor... Sıfır olmayanları ekranda göstermeliyiz...
    doldurdatagrid(// Burayı siz tamamlayınız...); 

6 - En son olarak da çıkış butonunu yapınız...

25 Şubat 2014 Salı

Veritabanı Ders Uygulamaları - 5

Update işlemine örnek oluşturacak olan bir çalışma yapacağız... Aşağıdaki form tasarımını gerçekleştiriniz... Text kutularının groupbox içerisinde olmasına özen gösteriniz... 

















Yine aynı şekilde aşağıdaki veritabanı tasarımını gerçekleştiriniz... Bu işlemi yaparken Kimlik değerini otomatik sayı olarak tanımlamayı unutmayınız... 













Çalışma sırasında tablodan seçmiş olduğumuz ürün bilgileri textlerde gösterilecek ve üzerinde değişiklik yapıldıktan sonra ürün düzenle butonuna basıldığı anda update komutu ile güncelleme yapılacaktır... 

1 - Veritabanı temel bağlantılarını ve da, ds değişkenlerini tanımlayınız...

2 - Aşağıdaki değişkenleri Global olarak tanımlayınız... 
        int kimliktasi = 0;            // Datagridview de seçili olan ürünün kimlik numarası...
      string urunad = "";         // Ürün bilgilerinin yedeğini almak için bu değişkenleri tanımladık... 
        string urunalt = "";
        string urunozellik = "";

3 - Datagridviewi dolduracağımız metodu aşağıdaki gibi hazırlayınız... 
void doldurdatagridview1()
        {
            ds.Clear();
            baglanti.Open();
            komut.CommandText = "Select * From yeniurun Order By [Adı]";
            komut.Connection = baglanti;

            da = new OleDbDataAdapter(komut);
            da.Fill(ds, "Tablo");
            dataGridView1.DataSource = ds;
            dataGridView1.DataMember = "Tablo";
            dataGridView1.Columns["Kimlik"].Visible = false; 
            baglanti.Close();
        }

4 - Veritabanında update işlemi yapacağımız metodu aşağıdaki gibi oluşturunuz...
void guncelleveritabanı(string sorgu)
        {
// Buradaki komutları siz doldurunuz... 
        }

5 - Güncelleme işlemleri sırasında ürünün daha önceki bilgileri ile aynı girilmesini engellemek için değerlerini değişkenlere alacağımızı söylemiştik... Bir metod ile datagridview de seçili olan ürünün bilgilerini urunad, urunalt ve urunozellik isimli değişkenlere alıyoruz... Bu işlem için aşağıdaki metodu kullanıyoruz...
void getir(string sorgu)
        {
            // Bağlantı ile ilgili giriş komutlarını doldurunuz...
            while (oku.Read())
            {
                    textBox1.Text = oku["Adı"].ToString();
                    textBox2.Text = oku["Tanım"].ToString();
                    textBox3.Text = oku["Özellik"].ToString();
                    urunad = textBox1.Text; urunalt = textBox2.Text; urunozellik = textBox3.Text;
            }
            // Bağlantı ile ilgili çıkış komutlarını doldurunuz... 
        }

7 - Form giriş olayında groupbox ı pasif duruma getiriniz... Bu sayede veri düzenleme işlemi yapılmasını engelleyelim... Aynı zamanda datagridview e bilgileri doldurunuz... 

8 - Datagridview in aşağıdaki olayını etkinleştiriniz...
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)

9 - Bu olayın içerisinde groupbox ı aktif hale getiriniz... Aynı zamanda aşağıdaki satırlar ile hem kimlik numarasını alalım, hem de kimlik numarasına ait olan verileri değişkenlerimiz de saklayalım...
kimliktasi = int.Parse(ds.Tables["Tablo"].Rows[e.RowIndex]["Kimlik"].ToString());
// Burada getir metodu ile kimliktasi değerine göre sorgulama yaptırınız...

10 - En son olarak ürün düzenle butonun içerisine yazılacak olanlara bakalım... Öncelikle veri düzenleme yapmadan hem textlerin içerisinin dolu olduğunu hemde düzenleme yapılmadan geçilmemesi gerektiğini aşağıdaki gibi bir if ile yapalım... 
if (textBox1.Text == "" || textBox1.Text == urunad)
  MessageBox.Show("Yeni ürün adı giriniz...");
else if // Devamını siz doldurunuz...

11 - Bütün şart kontrolleri yapıldıktan sonra her hangi bir aksilik yok ise veritabanında güncellemeyi yapınız...
guncelleveritabanı("Update yeniurun Set [Adı]= '" + textBox1.Text.ToUpper() + "', [Tanım]= '" + textBox2.Text.ToUpper() + "',[Özellik]= '" + textBox3.Text.ToUpper() + "' Where [Kimlik]=" + kimliktasi); 

12 - Datagridview i yine bu buton içerisinde doldurunuz...

13 - groupboxı pasif hale getirerek ve textlerin içeriğini temizleyerek programı bitiriniz... 

24 Şubat 2014 Pazartesi

Veritabanı Ders Uygulamaları - 9

Veri ekleme yani insert olayı ve veri silme yani delete olayını yapabileceğimiz bir uygulama gerçekleştireceğiz... Uygulamamız daha önceki örnekler de göz önünde bulundurulduğunda gayet basit ve ideal... Daha önceki tablo örneklerinde de kullanmış olduğumuz bilsay veritabanını aşağıdaki gibi hazırlıyoruz... 


Kimlik alanı daha önceki örneklerde olduğu gibi otomatik sayı olarak tanımlanacaktır... Gelelim programın çalışmasına... Aşağıda programın çalışmasından örnekler mevcut... Öncelikle tasarımı aşağıdaki gibi yapıyorsunuz...

















Yeni ürün ekleme durumu... Yeni ürün ekle butonuna bastığımız anda ekleme işlemini yapıyor... 

































Her hangi bir ürünü silmek için ise seçmemiz yeterli olacaktır... Tablodan seçtikten sonra ürün sil butonu ile birlikte silme işlemi yapılabilir...

1 - Tasarımı yukarıdaki örneklere benzer şekilde gerçekleştiriniz...

2 - Daha önceki örneklere de bakarak baglanti, komut, da ve ds değişkenlerini tanımlayınız... baglanti değişkeni oledbconnection türünde, komut değişkeni oledbcommand türünde, da değişkeni oledbdataadapter türünde, ds değişkeni dataset türünde olacak şekilde tanımlayınız... Aynı zamanda baglanti değişkenine veritabanının yolunu da eklemeyi unutmayınız...

3 - Aşağıdaki iki değişkeni de genel kısımda tanımlayınız... Tanımlama sebepleri yanlarında yazmaktadır...
        int kimliktasi = 0;     // Datagridviewdeki seçilen ürünün numarası için...  
        bool secilivar = false; // Seçili ürün kontrolü için... 

4 - Datagridview i dolduracak aşağıdaki gibi bir metod yazınız... Burada veritabanında ki tüm verileri Adı alanına göre listeleyecek şekilde bir sorgu yazınız...  
void doldurdatagridview1()

Bu arada veritabanın da bulunan Kimlik alanını da datagridview de göstermeyeceğimiz için aşağıdaki komut satırını bu metoda eklemeyi unutmayınız... 
dataGridView1.Columns["Kimlik"].Visible = false;

Yine datagridview i güncellememiz gereken yerlerde üst üste bilgilerin gözükmemesi için ds değişkenini Clear komutu ile silmeyi unutmayınız... 

5 - Bir diğer metodumuz da kaydetme ve silme işlemleri için veritabanına ulaşacağımız aşağıdaki metoddur... Bu metodumuza da insert ve delete ile göndereceğimiz sql sorgusunu, sorgu isimli parametremiz ile alacağız... 
void guncelleveritabanı(string sorgu)

6 - Formun girişinde datagridview i dolduran metodumuzu çağıralım ve program açıldığında bütün veriler datagridview içerisinde gözükmüş olsun... 

7 - Datagridview in private void dataGridView1_CellClick olayına aşağıdaki kodları ekleyelim... 
secilivar = true;
kimliktasi = int.Parse(ds.Tables["Tablo"].Rows[e.RowIndex]["Kimlik"].ToString());
Yine bu olay içerisinde e.RowIndex değeri -1 ise veritabanından her hangi bir Kimlik numarası aldırmayalım... Eğer bu işlemi yapmazsak alan başlıklarına tıklandığında program hata verecektir... Bunu try catch veya alan başlıklarına tıklamayı kaldırarak da yapabilirdik... 

8 - Ekle butonu içerisine kodları yazmaya başlayalım... Öncelikle bir tane if ile text kutularından boş olan varsa eklemeyi engelleyecek olan kodu yazalım ve bu durumda uyarı mesajı verdirelim... Bu sayede kutuların hepsini doldurmadan ekleme yaptırmayalım... 

9 - Aşağıdaki satır ile veritabanına eklemeyi yapalım... 
guncelleveritabanı("Insert Into yeniurun ([Adı],[Tanım],[Özellik]) Values ('" + textBox1.Text.ToUpper() + "','" + textBox2.Text.ToUpper() + "','" + textBox3.Text.ToUpper() + "')");

10 - Hemen ardından datagridview i güncelleyelim ve text kutularını temizleyelim... 

11 - Sil butonunun içeriğini yapalım... Öncelikle secili ürün olmadan silme işlemi yapamayız... Bu sebeple  
if (secilivar)
            {
                // Buraya seçili olan kimlik numarasına göre silme ile ilgili komut satırı gelecek... Hemen ardından datagridview i güncelleyeceğiz... 
            }
else
                MessageBox.Show("TABLODAN ÜRÜN SEÇİMİ YAPINIZ...");

12 - Yine silme işleminden hemen sonra seçili olan ürün değişkenimizi false yaparak yeni seçim yapılmadan sil butonunu çalıştırmamış oluyoruz... Aşağıdaki komutu silme işleminin hemen sonrasına ekleyiniz... 
secilivar = false;

Bu ekleme ile program bitmiş olacak... 




17 Şubat 2014 Pazartesi

Veritabanı Ders Uygulamaları - 8

Vizyondaki filmleri gösteren ve onlar üzerinde kayıt yapabilen bir program yapacağız... Bu program ile birlikte bilgi girişi yaparken parametre kullanımı hakkında bilgi sahibi olacağız... Bilgi girişlerinin tamamında parametre kullanmakta fayda vardır...

1 - Aşağıdaki form tasarımını yapınız...
2 - Bu form tasarımından sonra kod kısmına doğru geçelim... Ama öncelikle form tasarımı sırasında label5 yazan labelların textlerini silelim ve comboboxın içerisine aşağıdaki başlıkları ekleyelim...
Komedi
Aksiyon
Dram
Bilim Kurgu

Bunlar bizim filmlerimiz için tür seçimlerinde kullanacağımız başlıklar olacak...

3 - Buradaki en önemli buton şu anda kayıt butonudur... Formun genel değişken kısmına baglan ve komut değişkenlerini tanımladıktan sonra kayıt butonunun içerisine aşağıdaki parametre ekleyen komutları yazalım...
string Sorgu = "INSERT INTO vizyon ([FilmAdı], [VizyonTarih], [Tur], [Konu]) VALUES (@FilmAd, @Tarih, @Tur, @Konu)";
komut = new OleDbCommand(Sorgu, baglan);
komut.Parameters.AddWithValue("@FilmAd",textBox1.Text.ToUpper() );   
komut.Parameters.AddWithValue("@Tarih", dateTimePicker1.Value.ToShortDateString());
// @tur ve @konu parametrelerini de siz yazınız... 
komut.ExecuteNonQuery(); // 

Parametre işlemlerinde öncelikle sorgu yazılır daha sonra sorgu içerisinde kullanılan parametrelere değer gönderilir... Parametrelerin başında @ işareti kullanılır ve parametrelere değer atanırken Add.WithValue kullanılır... 

4 - Yukarıdaki parametre işlemlerini buton içerisinde yaparken bağlantıyı açıp kapamayı unutmayınız...

5 - Geriye kalan işlemi bir metod üzerinden yapacağız... bu metodu aşağıdaki gibi tanımlayınız... 
void listele(string durum, string sorgu)

6 - Bu metod içerisinde veritabanından değerleri okuma işlemi yaptıracağız... durum adındaki parametreye iki değer göndereceğiz... 
  • Eğer "listekle" değerini gönderirsek girilmiş olan filmin adını listboxa ekleyecek... Unutmadan her kayıt sonunda bu metodu çağırarak listboxa film adını eklemeyi unutmayalım... Tabii bu durumda her kayıt sonunda film adı eklemeden listboxı temizleyeceğiz... 
  • Eğer "listgoster" değerini gönderirsek listboxda seçilmiş olan film adının diğer bilgilerini labellar da göstereceğiz... Tabii bu işlemi siz while (oku.Read()) döngüsünün içerisinde kontrol edeceğiniz bir if şartı ile yapacaksınız... Eğer "listekle" gönderilmişse listboxa film isimleri eklenecek, yok "listgoster" gönderilmişse labellar da bilgiler gözükecek...
7 - Bu metodun diğer parametresi ise sorgudur... Sql sorgusunu bu parametreye göndereceğiz... Eğer listboxa eklemeye yapıyorsak bütün tabloyu okuyacak olan bir sorgu yazmamız da bir mahsur yok... Ama seçili olan film ile ilgili bilgileri görmek istiyorsak o zaman bütün tablo yerine sadece seçili olan filmi göstermek daha iyi olacaktır... Bu durumda bir Where ifadesi kullanmalıyız... Aşağıdakine benzer bir ifade ile listboxın seçili olan elemanını kontrol ettirebiliriz... 
Select * From bilsay Where Ad = ' " + listbox1.items[listbox1.selectedindex]+ " ' ";


8 - Goster butonuna tıklandığı anda listboxda seçim yapıldı ise film bilgilerini labellarda göstereceğiz... Ama burada bir kontrol daha yapmalıyız... Eğer listboxda seçim yapılmadı ise bu durumda seçim yap diye uyarmalıyız... Bir kontrol nesnesinde seçim yapılıp yapılmadığını nasıl anlarız... Çok basit... C# daki bütün kontrol nesnelerinin Selectedindex özelliklerinde seçim yapılmadıysa değer olarak -1 geriye döner... Bu durumda buton içerisinde kuracağımız bir if şartı ile seçim -1 ise uyarı mesajı verdirmeliyiz... 

9 - Bu arada formun girişinde de film isimlerini yine listele metodu ile listboxa eklemeyi unutmayalım... 

Şimdi çalışan programdan bir kaç görüntü verelim... Daha önceden veri girilen formun açılışı...
Her hangi bir filmin gösterimi ve seçim yapılmadı ise uyarı mesajı verilmesi...



Bir film ile kayıt eklenmesi... 
Son olarak kayıt işleminden sonra yapılacak olan bir temizle metodu da eklenebilir... Bu kadar... 

14 Şubat 2014 Cuma

Veritabanı Ders Uygulamaları - 7

1 - Aşağıdaki veri tablosunu oluşturunuz. Veritabanı adı olarak bilsay tanımlayınız. Tablo adı da stok olacaktır.









2 - Form tasarımı olarak ekrana bir tane tabcontrol nesnesi yerleştiriniz. Tabcontrol nesnesinin tabpage özelliğinin içine giriniz. Açılan pencerede 0 numaralı tabpage ismini text özelliği ile Ana Ürünler, 1 numaralı tabpage ismini text özelliği ile Alt Ürünler olarak değiştiriniz.


3 - Sonuçta aşağıdaki gibi bir form tasarımı olacaktır.

4 - Her bir tabpage in içerisine bir tane datagridview yerleştiriniz. Bunun için form sayfasında Ana Ürünler seçili iken datagridview i getirip yerleştiriniz. Aynı şekilde Alt Ürünler seçili iken de datagridview i seçip yerleştiriniz. Bu durumda iki adet datagirdview i ekrana yerleştirmiş olduk. 

5 - Datagridvewlerin AutoSizeColumns özelliğini Fill olarak değiştiriniz. Bu sayede tablonun datagridview in içerisini tamamen kaplayacaktır. 

6 - Yine datagridviewin MultiSelect özelliğini False olarak değiştiriniz. Bu sayede datagridview üzerinde aynı anda ikinci bir seçim yapılması engellenecektir.

7 - Datagridiview üzerinde font özelliklerini değiştirmek için DefaultCellStyle özelliğine girip Yazı rengini mavi, yazı boyutunu 10 olarak değiştiriniz. Bunu her iki datagridview içinde gerçekleştiriniz.

8 - Kod kısmına geçelim... Aşağıdaki gibi bir metod ile datagridview i dolduralım...
void doldurdatagridview(DataGridView gelendgw, string sorgu, string tabloadi)
{
       // Bu kısma gelecek olan içeriği siz doldurunuz... Datagridview içerisine bilgiler gelecek kodu yazınız...
}
Metodumuzda tabloadı olarak tanımladığımız parametre ile biz da.Fill kısmında belirlenen tablo ismini vermiş oluyoruz... İki tane datagridview olduğu için de gelendgw adında bir parametre kullanıyoruz... 

9 - Formun load olayında Ana Ürünlerin görülebilmesi için aşağıdaki kodu yazınız...
doldurdatagridview(dataGridView1, "Select [Adı], Sum(Miktar) AS TOPLAM, Sum(Y_Miktar) AS KULLANIM, Sum(Kalan) AS KALAN From Stok Group By [Adı]", "anatablo");

İki tane datagridviewimiz olduğu için datagridviewlerin tablo isimlerini farklı kullandık... 1. de "anatablo", 2. de "alttablo" olacak şekilde kullanmış olduk. 

10 - TabControl nesnemizinde Selectindexchanged olayına aşağıdaki kodları yazıyoruz... Eğer Ana Ürünler tabpage mizde ise ona ait olan datagridview gösteriliyor. Yok eğer Alt Ürünler tabpagemizde ise bu durumda ona ait olan datagridview gösteriliyor... 
        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
if (tabControl1.SelectedIndex == 0)
    doldurdatagridview(dataGridView1, "Select [Adı], Sum(Miktar) AS TOPLAM, Sum(Y_Miktar) AS KULLANIM, Sum(Kalan) AS KALAN From Stok Group By [Adı]", "anatablo");
else if (tabControl1.SelectedIndex == 1)
       // Buraya gelmesi gereken kodları siz yazınız. Burada Tanım alanı üzerinden bilgiler verilecektir...
        }

11 - Sonuçta program çalıştığı zaman aşağıdaki görüntüler alınacaktır...










Örneğimizi bitirmiş olduk...

13 Şubat 2014 Perşembe

Veritabanı Ders Uygulamaları - 6

DataGridView içerisinde seçilmiş olan ürünün istediğimiz bilgilerini anında labellar üzerinde gösteren bir veritabanı uygulaması gerçekleştireceğiz... Uygulama sürecinde datagridview in üzerinde verilerin gösterilmesi olayının yanında aynı zamanda datagridview üzerinde seçim yapıldığında olan değişiklikleri de göreceğiz...

1 - Öncelikle bilsay adında aşağıdaki veritabanımızı hazırlıyoruz... Bunun içerisinde stok adında bir tablo oluşturuyoruz...









2 - Bu veritabanımızda kimlik alanı otomatik sayı olarak tanımlanacaktır... Bunun dışında diğer bilgilerin tanımlamaları zaten bellidir...

3 - Kullanacağımız veritabanını bin/debug klasörünün altına yerleştiriyoruz...

4 - Aşağıdaki form tasarımını gerçekleştiriyoruz...

















5 - Sağ taraftaki labelların içeriklerini de silerek her hangi bir şekilde uygulama açıldığında görünmesini engelliyoruz...

6 - Uygulamamız açıldığı zaman otomatik olarak ilk verinin içeriğini sağ tarafta göstermeyecektir. Ondan sonra datagridview üzerinde tıklanan her hangi bir verinin içeriğini de göstermeye başlayacaktır... RowEnter olayını kullansaydık otomatik olarak veriyi gösterecekti...

7 - Kod kısmına geçelim... baglanti ve komut değişkenlerimizi aşağıdaki örneğe benzer şekilde tanımlıyoruz...
OleDbConnection baglanti = new OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0; Data Source=okul.mdb");
OleDbCommand komut  = new OleDbCommand();

8 - Aynı zamanda datagridview de kullanacağımız dataset ve dataadapter değişkenlerimizi de tanımlıyoruz...
OleDbDataAdapter da; DataSet ds = new DataSet();

9 - Datagridviewde bilgilerin görünmesini sağlayacak olan bir metod tanımlıyoruz... Bu işlemi yaparken bir metoda sorgu işlemini gönderebileceğimiz bir string türünde bir parametre tanımlıyoruz... Aşağıdaki örneğe benzer bir yapıyı metod içerisinde oluşturuyoruz...
         baglanti.Open();
            komut.CommandText = "Select * From ogrenci Where Adı = 'CPU'";
            komut.Connection = baglanti;

            da = new OleDbDataAdapter(komut);

            da.Fill(ds,"Tablo");
            dataGridView1.DataSource = ds;
            dataGridView1.DataMember = "Tablo";
            baglanti.Close();

10 - Datagridview de değerler gösterilirken görünmesini istemediğimiz bazı alanlar var... Görünmesini istemediğimiz alanların aşağıdakine benzer bir örnekle metod içerisinde gizliyoruz...Kimlik, Kalan ve Dipnot alanlarını gizleyiniz...
dataGridView1.Columns["Ad"].Visible = false;

11 - Form load olayında datagridview i dolduracak olan sql komutunu metoda yolluyoruz... Bu sayede form açıldığı anda veritabanındaki bütün bilgiler datagridview içerisinde dolmuş olacaktır...

12 - Aşağıdaki datagridview olayını aktif hale getiriyoruz... Bundan sonra yazacaklarımızı bu kısmın içerisine yazacağız...
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)

13 - Bu olayı kullanmamızdaki amaç tıklamış olduğumuz satıra ait olan kimlik numarasını bulmak... Çünkü kimlik numaralarını otomatik sayı olarak atadık ve hiçbir ürünün kimlik numarası bir diğeri ile aynı değil. Aşağıdaki komutu bu olayın içerisine ekliyoruz... 
kimlik= int.Parse(ds.Tables["Tablo"].Rows[e.RowIndex]["Kimlik"].ToString());

Yine aynı zamanda bilgileri labellar içerisinde görmek için birazdan tanımlayacağımız bilgileri goster metodunu da aşağıdaki gibi burada kullanıyoruz... 
bilgilerigoster(// Buradaki kısma alınan kimlik bilgisine ait veriyi  gönderecek olan bir sorgu yazınız);

14 - bilgilerigoster metodu ise sorguyu alacak olan bir parametre ile birlikte aşağıdakine benzer bir şekilde tanımlanacaktır...
baglanti.Open();
komut.CommandText = sorgu;
komut.Connection = baglanti;
OleDbDataReader oku = komut.ExecuteReader();
while (oku.Read())
            {
              label1.Text = oku["Adı"].ToString();
            }
oku.Close();
baglanti.Close();

15 - Programı çalıştırdığımızda aşağıdaki gibi bir çıktı oluşacaktır. Başlangıçta ekranda her hangi bir bilgi gözükmez iken daha sonra seçim yaparak labelları doldurmuş oluruz...











16 - Bu metod ile birlikte programı çalıştırdığımız zaman problem datagridview deki alan başlıklarına tıkladığımızda oluşan aşağıdaki hatadır.

Bu hatayı çözmek için farklı yöntemler vardır... Biz datagridview deki alan başlıklarının üzerine tıklama olayını cellclick olayına yazacağımız try-catch komutları ile önledik... Hata durumunda mesaj verdirmeden yoluna devam ettirmek için kodları try kısmına yazdık... Catch kısmına ise her hangi bir sıkıntı oluşmadığı için her hangi bir ekleme yapmadık...

17 - Form üzerinde her hangi bir alan başlığına tıklama yapıldığında ve daha sonra seçim yapıldığında da programda başka bir veriyi gösteriyor... Aşağıda görüldüğü gibi....











Bu sıkıntıdan kurtulmak için Form Load olayına aşağıdaki kodları ekledik... Bu sayede alan başlıklarına tıklama olayını ortadan kaldırmış oluyoruz... Tabii farklı yöntemler ile de bu sorun çözülebilirdi...
foreach (DataGridViewColumn x in this.dataGridView1.Columns)
                x.SortMode = DataGridViewColumnSortMode.NotSortable;

Bu haliyle programı bitirmiş olduk... 

26 Ocak 2014 Pazar

Dört İşlem Oyunu...

Yeni bir oyun daha. Dört işlem üzerinde zeka geliştirici bir uygulama. Oyunumuzda rastgele dört işlemden bir tanesi geliyor. Sayılar da rastgele geliyor. Oyunumuzda levellar var. Önce basit işlemler geliyor. Daha sonra iki basamaklı sayılarla yavaş yavaş zorlaşıyor. Oyun için 5 Level tasarladık. Çok basit bir şekilde istenirse bu level sayıları artırılabilir. 

Yine oyunumuzda can hakları var. 3 can ile oyuncu oyuna başlıyor. Her Leveli geçtiğinde bir can alıyor. Aynı zamanda her 100 Puanda bir can alıyor. Her yanlış bilmede 1 can gidiyor. Aynı zamanda süre kısıtlamamız var. Zaman dolmadan cevap vermek gerekiyor. Zaman dolarsa bir can hakkı gidiyor. 

Leveller ilerledikçe sorular zorlaştığı gibi aynı zaman da her soruya verilen puan artırıyor. Bir soruya verilen zaman süresi de artıyor. Çarpım işlemleri daha zor olduğu için iki katı zaman verdik.

Oyuna ara vermek istersek bir tane de durdurma ve tekrar başlatma butonumuz var. Dört işlemin hepsini yaptırıyoruz. Yalnız bölme işlemlerinde virgülden sonraki sayılarla uğraşmamak için tam kısmını cevap olarak aldık. Örneğin 9 /4 için cevap 2 olacaktır... 

Programın çalışmasından bir kaç örnek görüntü verelim... 

































Bölme işleminden bir örnek.

Seviye geçişlerinden bir örnek gösterim.

Açıkcasını itiraf etmek gerekirse özellikle 4. ve 5. levellerdeki işlemler gerçekten zor... Tabii bu oyuna daha kolay veya daha zor olacak şekilde ilaveler yapılabilir.

Şimdi gelelim kod kısmına... İlk olarak kullandığımız global değişkenlere bakalım...
        public int islem; // +-*/ için kullanılacak operatör...
        public int ilk_sayi;
        public int ikinci_sayi;
        public int can = 3;
        public int sure = 15;
        public int gecis = 0; // Bir sonraki levele geçmek için lazım olan değişken...
        public bool cevap = false; // Doğru cevap kontrolü...
        public int skor = 0;
        public int sonuc = 0; // İşlem sonuçlarını saklayacağımız değişkenimiz.

        // Aşagıdaki değişkenler 1. Level değerlerini alıyorlar...
        public int oyunsuresi = 15;
        public int oyunpuani = 7;
        public int seviyeatla=1;
        public int a1 = 5, a2 = 10, b1 = 1, b2 = 10;
        public int canvermepuani = 100;

Değişkenlerin yanlarında gerekli açıklamalar yapılmakta... Arayüz kısmına her hangi bir açıklama getirmedim. Çünkü onu zaten resimlerden çok rahat bir şekilde nasıl tasarlayacağınızı anlamışsınızdır.

Formun girişindeki kodlardan itibaren başlayalım açıklamaları yapmaya...
private void Form2_Load(object sender, EventArgs e)
        {
            timer1.Start(); // Zamanlama için kullandığımız Timer ı başlatıyoruz... 
            label7.Text = "Kalan Süre = " + sure.ToString(); // Süreyi yarışmacıya gösteriyoruz... 
            degergoster();
        }

Formun hemen girişinde zamanlamayı başlatıyoruz. Çünkü oyuncu verilen sürede soruya cevap vermeye bilir. Yukarıda kullandığımız bir tane metod var.  degergoster() metodu aşağıdaki gibidir.
void degergoster()
        {
            textBox1.Clear();
            sure = oyunsuresi;
            label4.Text = "Kalan Can = " + can.ToString();
            label8.Text = "Skorunuz : " + skor.ToString();
            label7.Text = "Kalan Süre  = " + sure.ToString();
            sayiatama();
        }

Şimdi degergoster() metodu her çağrıldığında neler yapılıyor bir bakalım.

  • Öncelikle textbox1 in içeriği temizleniyor.
  • Sure değişkenimize oyunsuresi değişkeninden gelen değer aktarılıyor. oyunsuresi değişkeni levellera göre değişiklik gösteriyor. bu sebeple her dogru veya yanlış cevaptan sonra kendini yenilemesinde fayda var.
  • Label 4,7 ve 8 de oyun ile ilgili genel durum bilgileri veriliyor.
  • En son olarak sayiatama() metoduna gidiliyor. Bu şu demek. Metod içerisinden başka bir metodun içerisine yönlendirme yapılıyor ve program dallanıyor. Peki sayiatama() metodunda ne var. Tahmin edeceğiniz gibi sayılar ve yapılacak olan işlem belirleniyor. Bu metoda bakalım.

void sayiatama()
        {
            char[] aritmetik = {'+', '-','*','/'};//4 İşlem Değişken Tanımı

            Random rnd = new Random();
            //İşlem seçimi yapılıyor...
            islem = rnd.Next(0, 4);
            label2.Text = aritmetik[islem].ToString();
            if (islem == 2) // Çarpma işleminin zorluğundan dolayı süreyi uzun tutuyoruz...
                sure = sure * 2;
         
            // Sayı atamaları yapılıyor...
            ilk_sayi = rnd.Next(a1, a2);//ilk sayı
            label1.Text = ilk_sayi.ToString();
            ikinci_sayi = rnd.Next(b1, b2);//ikinci sayi
            label3.Text = ikinci_sayi.ToString();
        }
Bu metod ile ilgili söylenebilecek çok bir şey yok. Fark ettiğiniz gibi işlem seçimi yapılıyor ve rastgele sayılar atanıyor. Tek farklı durum burada çarpma işlemi seçim olarak gelirse süreyi iki katı vermek oluyor.

Peki ilk bu işlemden sonra ne yapılması gerekiyor. Artık oyun başladı ve sayı atamaları yapıldı demektir. Oyuncunun cevabı yazması ve butona basması artık rahatlıkla beklenebilir. Peki oyuncu doğru cevabı verip butona basarsa ne olacak. Cevapla butonunun içerisine bakalım.
private void button1_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            sonucukontrolet();
        }

İlk bakışta belli oluyor. Çok kısave net. Timer durduruluyor hemen ve sonucukontrolet() adındaki metod çalıştırılıyor. Çünkü girilen sayı ile bilgisayarın sonucu kontrol edilmesi lazım. Bakalım sonucukontrolet() metodunda neler oluyor.
void sonucukontrolet()
        {  // Madde1:
            if (can!=0 && textBox1.Text !="") //can 0'a eşit olmadığı sürece Yapacağı İşlemler
            {
                // Madde2:
                //İslem işarete göre yapılıyor... Sonuc ile Giris kıyaslanıyor...
                int giris = int.Parse(textBox1.Text);
                if (islem == 0)
                    sonuc = (ilk_sayi + ikinci_sayi);
                else if (islem == 1)
                    sonuc = (ilk_sayi - ikinci_sayi);
                else if (islem == 2)
                    sonuc = (ilk_sayi * ikinci_sayi);
                else if (islem == 3)
                    sonuc = (ilk_sayi / ikinci_sayi);
                if (sonuc == giris) cevap = true; //  Cevabın doğru olup olmadığını bu if ile anlıyoruz.

                // Madde3:
                if (cevap == true) // Doğru cevap verildiyse
                {
                    gecis++; // Bir level da toplam 7 soru sorduruyoruz. Bu değişken toplam soru sayısını tutuyor.
                    MessageBox.Show("Doğru Cevap Verdiniz... Sıradaki Sorunuz Geliyor...");
                    timer1.Start();
                    skor = skor + oyunpuani; // Oyuncuya puanı ekleniyor.

                    // Madde4:// Bir sonraki seviyeye geçiş kontrol ediliyor...
                    if (gecis>=7)
                    {
                        timer1.Stop();
                        seviyeatla++;
                        if (seviyeatla >= 6) // Son level ise oyunda toplanan skor oyuncuya gösteriliyor.
                        {
                            MessageBox.Show("Oyun Bitti Tebrikler... Skorunuz:" + skor);
                            Application.Restart(); // Her şey bitirilip tekrar program başlatılıyor.
                        }
                        MessageBox.Show(seviyeatla + ". Seviyeye Geçmeye Hak Kazandınız...\n"+(seviyeatla-1).ToString()+". Seviye Skorunuz : "+skor.ToString());
                        MessageBox.Show("+1 Can Geldiiiii..."); //Her level geçişinde 1 can veriliyor.
                        can++;
                        gecisyap(seviyeatla);
                        gecis = 0;

                    }
                    puankontrolet(); // Bu metod her 100 puanda bir can vermek için skoru kontrol eden bir metoddur.
                    degergoster(); // Son durumlar gösteriliyor aynı zamanda yeni sayılar atanıyor...
                }
                // Madde5:
                else if (cevap==false) // Cevap yanlışsa bu kısım işliyor.
                {
                    gecis++;
                    MessageBox.Show("Yanlış Cevap Verdiniz. 1 Canınız Eksiliyor. Dogru Cevap " + sonuc.ToString() + "olmalıydı");
                    surekontrolvecanazalt();
                    timer1.Start();
                }
                cevap = false;
            }
         
            else if (can==0)//can 0'a eşit olduğunda yapacağı İşlem... Oyun bitiyor...
            {
                MessageBox.Show("Hakkınız Tükenmiştir... Oyun Skorunuz:" + skor);
                Application.Restart();
            }
        }

Sizinde tahmin edeceğiniz gibi programın can alıcı noktası geldi. Burayı biraz irdeleyelim.
Madde1: Şimdi can yoksa ve kutuya değer girilmediyse kesinlikle cevap kontrolü yaptırmıyoruz. bu durumda can==0 if satırı ile oyunu bitiyoruz.
Madde2: İşlemleri yaptırdığımız kısım burası. Önce hangi dört işlem var ise onu belirleyip sayılara işlemleri yaptırıyoruz. Sonrada oyuncunun girdiği ile doğru olup olmadığını kontrol ediyoruz.
Madde3: Cevap doğru ise mesaj verdiriyoruz. Skoru ve soru sayısını artırıyoruz. Aynı zamanda her doğru cevapdan sonra toplam soru sayısı 7 yi geçti ise bir sonraki levela geçiş yaptırıyoruz.
Madde4: Geçiş içinözel bir şey demeye gerek yok. Sadece her geçişte  gecisyap(seviyeatla) adındaki metoda gitmemiz gerekiyor. Bu metoda seviye sayısını gönderiyoruz ve o bize yeni değerleri belirleyip oyuna devam ettiriyor. Bir de bu maddenin içeriğinin tamamı cevap yanlış ise de olması lazım. Ama biz eklemedik. Niye eklemedik. Bilmiyorum:)
Madde5: Şimdi burada da kullanılan bir metod var. O da  surekontrolvecanazalt(); metodu. Birazdan buna da bakacağız.

Şimdi yukarıdaki metodlara tek tek bakalım. gecisyap(seviyeatla); metodu:
void gecisyap(int seviye)
        {
            if (seviye ==2)
            {
                oyunsuresi = 20; // Leveldeki sorular için verilen süre...
                oyunpuani = 12; // Leveldeki her doğru cevap için verilen süre...
                a1 = 10; a2 = 99; b1 = 10; b2 = 20; // Sayı aralıkları burada belirleniyor...
                label6.Text = "Level 2";
            }
            else if (seviye == 3)
            {
                oyunsuresi = 25;
                oyunpuani = 18;
                a1 = 50; a2 = 150; b1 = 20; b2 = 50;
                label6.Text = "Level 3";
            }
            else if (seviye == 4)
            {
                oyunsuresi = 30;
                oyunpuani = 24;
                a1 = 50; a2 = 200; b1 = 20; b2 = 100;
                label6.Text = "Level 4";
            }
            else if (seviye == 35)
            {
                oyunsuresi = 30;
                oyunpuani = 30;
                a1 = 100; a2 = 250; b1 = 50; b2 = 100;
                label6.Text = "Level 5";
            }
            timer1.Start(); // Seviye geçişlerinden sonra süreyi tekrar başlatıyoruz...
        }
Bu metodun tek yaptığı iş gelen seviye değerine göre yeni kuralları belirlemek. Yeni level de oyun süresi ne kadar olacak, her doğru soruya kaç puan verilecek. Aynı zamanda sayı aralıkları ne kadar olacak.

Bir diğer metod. puankontrolet(); metodu:
void puankontrolet()
        {
            if (skor>=canvermepuani)
            {
                MessageBox.Show("+1 Can Geldiiiii...");
                can++;
                canvermepuani += 100;
            }
        }
Evet. Her 100 puana bir can veriyoruz. Bunun için skora bakıyoruz. Önce 100 puanı geçince bir can veriyoruz. Bir sonrakinde 200 puanı geçince bir can veriyoruz. Bu şekilde devam ediyor.

Son ve ne önemli metodlarımızdan birisi: surekontrolvecanazalt();
void surekontrolvecanazalt()
        {
            timer1.Stop();  // buraya geldiysek zaman durmalı.
            can = can - 1; // can muhakkak bir azalmalı. Çünkü ya zaman doldu, ya yanlış cevap verildi.
            sure = oyunsuresi; // Süre baştan yazılmalı. 
            skor = skor - 4; // Her hataya 4 puan düşüyoruz.
            degergoster(); // Değerleri yazdırdığımız gibi yeni soruyu da gönderiyoruz...
        }

Bu sayede cevapla butonun içerisinde olanlar yani sonucukontrolet metodunda olanları açıklamış olduk. Dikkatli bir takip ile buraya kadar anlattığımız her şey gayet rahat bir şekilde anlaşılmış olmalı dersek inanmayın. Hakikaten biraz karmaşık. Ama anlaşılmayacak bir durum değil. :)

Peki zaman azalacak, zamana bakılacak diyoruz da timer_tick de kod olarak ne yazılacak. bir de bu kısma bakalım. Burada timerın intervalini 1000 olarak ayarlamayı arayüzde özellikler kısmında unutmayalım.
private void timer1_Tick(object sender, EventArgs e)
        {
            sure--; // Verilen süreyi her seferinde bir azaltıyor...
            label7.Text = "Kalan Süre  = " + sure.ToString();
            if (sure == 0) // Süre sıfır oluncada dananın kuyruğu kopuyor... 
            {
                surekontrolvecanazalt();
                MessageBox.Show("Cevap Verme Süreniz Doldu. \n1 Can Kaybettiniz.");
                timer1.Start();
            }
        }

En son olarak da durdur butonunun kodlarına bakalım. Oyunun istediğimiz yerinde ara verebiliyoruz. Bir de ipucu. Soru çok zor ise durdurun ve yeniden başlayın. Ne de olsa bir kontrol yapmadık. Her durdurmada da soru değiştiğine göre :):)

        int baslatbutonu = 1; // Bu global değişken... Sakın unutmayın...
        private void button2_Click(object sender, EventArgs e)
        {
            baslatbutonu++; // Her butona basıldığında bir artırıyoruz... 
            if (baslatbutonu % 2 == 1)
            {
                button1.Enabled = true;
                timer1.Start();
                button2.Text = "DURDUR";
            }
            else if (baslatbutonu % 2 == 0)
            {
                timer1.Stop();
                button1.Enabled = false;
                button2.Text = "BAŞLAT";
            }

            degergoster();
        }

Buradaki amaç aynı buton üzerinde hem oyunu durdurmak, hem de yeniden başlatabilmek. Bunun için birbirinin tersi işlemini yapan iki if var burada. Eğer durdurmak istiyorsak, timerı durduruyoruz, cevapla butonunu pasif hale getiyoruz, butonun üzerindeki yazıyı Başlat olarak değiştiriyoruz. Başlatmak istiyorsak da bunların tam tersini yapıyoruz. Son olarak baslatbutonu değişkeni tek sayılarda başlatıyor, çift sayılarda durduruyor. Bu son yazdığım cümleyi anladıysanız programı anladınız demektir.

Bu oyuna o kadar çok ekleme yapılabilir ki... Onları da size bırakıyoruz...