Dinamik buton oluşturup kontrol etme

Runtime zamanında bazen dinamik buton oluşturmak istemişizdir. Yada kod ile buton oluşturmak…  Buna, kullanıcının ihtiyacına karşı olarak projelerimizde kullanmaktayız.

dinamik-coklu-buton

Örneği anlamak için form ekranıına bir adet label, textbox ve buton resimdeki gibi oluşturup kodlamaya geçebiliriz. Kullanıcıdan alınan buton sayısı doğrultusunda form ekranın büyüklüğüne göre oluşturulan butonları boyutlandıra biliriz.

Boyutlandırmadaki amaç birden fazla buton eklendiği için normal şartlarda yan yana veya alt alta standart boyutta buton oluşturmakta. Hem bunları bir sıraya sokup hemde formun genişliğine ve yüksekliğini referans alarak butonları düzgün bir şekilde göstere biliriz.

 private void button1_Click(object sender, EventArgs e)
        {
            int butonSayisi = Convert.ToInt32(textBox1.Text);
            int sol = 1; //formun sol tarafından atanan değer
            int alt = 50; // formun üst tarafından atanan değer
            int bol; // bolme işlemindeki amaç formun boyutuna göre butonları sıralı bir şekilde görebilmek için
            bol = Convert.ToInt32(Math.Ceiling(Math.Sqrt(butonSayisi)));

            for (int i = 1; i <= butonSayisi; i++)  // girilen buton sayısına göre döngü şartı sağlanana kadar oluşturmakta
            {
                Button btn = new Button();
                btn.Name = i.ToString();

                btn.AutoSize = false;

                btn.Size = new Size(this.Width / bol, this.Height / (bol * 2));
                btn.Text = "Buton " + i.ToString();
                btn.Font = new Font(btn.Font.FontFamily.Name, 18);
                btn.Location = new Point(sol, alt);
                this.Controls.Add(btn);
                sol += btn.Width + 5;

                if (sol + this.Width / bol > this.Width) // bunu yapmasaydık butonlar yan yana dizilir alt satıra geçmedi
                {
                    sol = 1;
                    alt += this.Height / (bol * 2) + 5;
                }

                btn.Click += new EventHandler(dinamikMetod); // dinamik olarak oluşturulan butonu kontrol etmek için her oluşturulan butonun clik olayına atıyoruz.

            }
        }

Kod içinde yeterli açıklama mevcut.  Genel olarak anlatırsak; form içinde butonları düzgün bir şekilde görünebilmesi için girilen buton sayısı değerinin Math.Sqrt ile kare kökünü alıp sonucun doğru bir şekilde çıkması için Math.Ceiling ile yuvarladık.  Bunu yapmamızın nedeni, kullanıcının girdiği buton sayısına göre butonların büyüklüğünü ayarlayabilmek. Bunu yapmasak kullanıcı 100 tane buton istese, buton büyüklüğünü önceden girdiğimiz için butonları çoğu taşacak veya üst üste gelerek kötü bir görüntü elde edeceğiz. Örneği uygulayarak konuyu anlayacağınızı umuyorum.

Dinamik olarak oluşturulan butonu nasıl yakalayabiliriz derseniz üst tarafta oluşturduğumuz butonlar içine atanan clik olayını metod yardımı ile yakalayıp, runtime da oluşturulan butona tıklanıldığında o butona ait isim, vs özelliklerine ulaşabiliriz. Bunun için alttaki kodları örneğimize dahil ederek konuyu öğrenebilirsiniz.

 protected void dinamikMetod(object sender, EventArgs e)
        {
            Button dinamikButon = (sender as Button);
            MessageBox.Show(dinamikButon.Text + " isimli butona tıkladınız");
        }

Burada tıklatılan butonun textini mesaj kutusunda gösterdik.

Aynı şekilde diğer kontrolleri de(label, combobox gibi) oluşturabiliriz.  Bu örnek uygulamayı nerede kullanabiliriz derseniz; adisyon programında işletme sahibinden girilen masa sayısını form ekranına gösterip, herhangi masa hesabını açmak ve kapatmak için kullanabiliriz.

Listview tüm verileri database kayıt etme

Textbox dan veya başka bir yerden Listview’e girilen değerleri database imize kayıt etmek isteyebiliriz. Şöyle kısa bir senaryo ile anlatalım; kafe adisyon programında, garson masa müşteriden sipariş edilen ürünleri listview de saklayıp müşteri hesabını ödeyeceği zaman satılan ürünlerin adını ve fiyatını hesap kesiminde database’e kayıt ettirebilir. Buna benzer senaryoda kullanma babında bu uygulamayı paylaşmak istedim.

Örnek için resimdeki gibi bir arayüz formu hazırlayabilirsiniz. Buradaki amaç ilk önce textbox lardan girilen değerleri listview e kayıt etmek ardından listviewdeki tüm verileri tek hamle ile database e göndermek.

Burada coder isimli bir veritabanı bir tablo, içerinde id, adi ve soyadi kolonu bulunmakta. İlk önce textbox dan listview’e veri kayıt edelim.

1
2
3
4
5
6
7
8
private void button1_Click(object sender, EventArgs e)
{
ListViewItem lv = new ListViewItem();
lv.Text = textBox1.Text;
lv.SubItems.Add(textBox2.Text);
listView1.Items.Add(lv);

}

[stextbox id=”info”]Listview sınıfı nesneyi tanımladık fieldlarını doldurduk. Ardından listView1.Items.Add(lv) nesnedeki değeri listview e gönderdik. [/stextbox]

Resimdeki listview altında dbkayıt butonu ise listviewdeki değerleri tek seferde database e kayıt etmemizi sağlamakta. Buton clik ile kodlarına dalacak olursak;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
private void button2_Click(object sender, EventArgs e)
        {

            int etkilenen = 0;

            for (int i = 0; i < listView1.Items.Count; i++ )
            {

                try
                {
                    SqlConnection sql = new SqlConnection("server=.; database=coder; trusted_connection=true;");
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = sql;

                    string adi = listView1.Items[i].SubItems[0].Text;
                    string soyadi = listView1.Items[i].SubItems[1].Text;
                   
                    cmd.CommandType = System.Data.CommandType.Text;
                    cmd.CommandText = "insert into tblkisi (adi,soyadi) values (@adi, @soyadi)";

                    cmd.Parameters.AddWithValue("@adi", adi);
                    cmd.Parameters.AddWithValue("@soyadi", soyadi);
                    sql.Open();
                    cmd.ExecuteNonQuery();

                    sql.Close();
                }
                catch (Exception)
                {
                    MessageBox.Show("Kayıt edilmedi");
                }
                                         
            }
            if (etkilenen != 0) // Açıklama 11 :
            {
                MessageBox.Show("Kayıt edilmedi !!!");
            }
            else
            {
                MessageBox.Show("Kayıt edildi...");
               
            }

        }

For döngüsü ile listview eklenmiş satır sayısı kadar döngü kurduk. Döngünün içinde değerleri okuması için listView1.Items[i] kaçıncı satırda ise o satırdaki veriyi stirng değişkenlerine atadık. Programın kopma noktası da burası oluyor zaten. Geriye kalan kısım Ado.net den başkası değil…

Programda bazı şeyler eksik biliyorum ama hatasız çalışmakta. Burada aktarmak istediğim bilgi listview içinde for ile dönmeden başka bir şey değil…

C# da TC kimlik no algoritma ile doğrulama

Başlığı daha sade anlaşılır tutmak isterdim ama saat gecenin 02:36’sı kusura bakmayın. Hikaye blogu değil burası dediğinizi, daha şimdiden sinirlendiğinizi hissedebiliyorum. Küçük büyük bir çok projede TC kimlik numarsı doğrulama gibi sıkıntımız olmuştur. Bilindiği gibi TC kimlik numarası rastgele sayılardan oluşmaz, belirli algoritma sonucunda oluşmuştur. Bunun hakkında fazla konuşmadan isteyenler için burada ki adreste algoritma hakkında detaylı bilgiye ulaşabilir.

Algoritmalardan hariç webservis ile de internet üzerinden TC kimlik no doğrulanmakta. (Webservisi kullanmak için bu “https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx” adresi kullanabilirsiniz) Ama biz webservis fazla kurcalamadan internetsiz organik yöntemler ile hızlı bir şekilde doğrulamayı planlıyoruz.

C# ile basit form üzerinde textbox, label, buton kullanarak anlama babında yaptığımız uygulama ile yazımıza devam edelim. TC kimlik numaramızın ilk 10 rakamın toplamının birler basamağı, 11. rakamı vermekte. Bu şekilde TC kimli no kontrolü yapılabilmekte. Bu algoritma ile yola çıkarak programımızı geliştirdik. Form için gerekli elemanları ekledikten sonra kod kısmına geçerek daha iyi anlayabiliriz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        private void button1_Click(object sender, EventArgs e)
        {

            if (11 != textBox1.Text.Length)  // Girilen sayı 11 haneli olmak zorunda
            {
                label1.Text = "Eksik veya fazla sayı girildi";
            }

            else
            {
                int toplam = 0; // 1. Açıklama
               
                for (int i = 0; i < textBox1.Text.Length - 1; i++) // 2. Açıklama
                {
                    toplam += Convert.ToInt32(textBox1.Text[i].ToString()); // 3. Açıklama
                }
               
                if (toplam.ToString()[1] == textBox1.Text[10]) // 4. Açıklama  
                {
                    label1.Text = "Tc kimlik Numarası Doğru";  // 5. Açıklama
                }
                else
                {
                    label1.Text = "Tc kimlik Numarası Yanlış";
                }

            }


        }

Buton click olayı ile başlayan programımızın açıklamasını kodların yorum kısmından alttaki açıklamalarla öğrenebilirsiniz;

  1. Uygulamanın kopma noktası bu değişken. 0 değeri vererek tanımlıyoruz. Bu şekilde yapılmasını amacı değişkenin for blogu içinde kullanıması için.
  2. Girilen Tc kimlik numarasının ilk 10 rakamını almak için length dan 1 eksiğini döndürdük
  3. Girilen sayıları soldan sağa doğru tek tek topladık, sonucu toplam değişkeninde biriktirdik.
  4. Burada toplam sayının birler basamağını almak için 1 yazdık 0 ile onlar basamağındaki sayıyı alırdık. Alınan sayı ile girilen tc kimlik numarasının 10. indeksi yani (0 dan başladığını hatırlayalım) 11. sayı ile karşılaştırdık.
  5. Eşit ise TC kimlik numarası doğru…

Kısa yoldan toplu textbox temizleme

Bu konu hakkında birçok yazı yazılmıştır. Daha önce yazılanları unutun demeyeceğim, yedekte kalması babında kaynaklanarak yazdığım en kısa toplu textbox temizleme metodu şimdilik bu olsa gerek;

Projelerimizde ki formlarda birden çok textbox kullanmışızdır. Malum işlem yapıldıktan sonra kendiliğinden temizlemediği için iş yazılımcıya düşmekte. Foreach ile yapacağımız bu işlemi resimdeki gibi form tasarlayıp buton yardımı ile gerçekleştirebilirsiniz.

1
2
3
4
5
6
7
8
9
10
 private void button1_Click(object sender, EventArgs e)
        {
            foreach (Control ktn in this.Controls)
            {
                if (ktn is TextBox)
                {
                   ktn.Text="";
                }
            }
        }

Form içindeki tüm textboxları temizleme ihtiyacı duymaya bilirsiniz. Mesela belirli textboxları temizlemek için form a panel ekleyip toplu temizlemek istediğiniz textboxları panel içine koyabilirsiniz. Bunun için yapmamız gereken this(form içindeki tüm kontrolleri kontrol etmek için kullanırız) yerine panel1 şeklinde kontrol etmek;

1
2
3
4
5
6
7
  foreach (Control ktn in panel1.Controls)
            {
                if (ktn is TextBox)
                {
                   ktn.Text="";
                }
            }

Formu titretme ve Opacity uygulaması

Csharp’da messengerdaki gibi form titretme, xp ilk açılış ekranı gibi formun yavaş yavaş görüntünün gelmesi uygulaması ile merhaba. Form titretme olayını this özelliğinden, formun sol ve üst değerini arttırıp azaltarak ufak yer değiştirme hareketleri ile göz yanıltması gibi oluşturabilirz. Formun soluktan yavaş yavaş açılmasını ise formun başlangıç(load kısımı) değerindeki Opacity‘sini 0 yapıp, belirli aralıklarla arttırarak yapabiliriz.

Yeni bir form açıp 1 buton ve 1 Timer nesnesi eklemeniz yeterli, kod kısımı ise;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private void Form1_Load(object sender, EventArgs e)
        {

//Opacity değeri başlangıçta 0 ve timer açık
            this.Opacity = 0;
            timer1.Enabled = true;
        }
        private void button1_Click(object sender, EventArgs e)
        {
// for kullanarak bir kaç saniye formu titreştiriyoruz. Sol ve üst kısmını 3'er arttırıp 3'er azaltıyoruz
            for (int i = 0; i < 200; i++)
            {
                this.Left += 3;
                this.Top += 3;
                this.Left -= 3;
                this.Top -= 3;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
// Opacity değerini 0.10'ar  arttırarak formu yavaş yavaş görüntünün gelmesini sağlıyoruz
            this.Opacity += 0.10;
            if (this.Opacity == 1)
            {
                timer1.Enabled = false;
            }
        }

Olay bu kadar…