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.

[cc lang=’csharp’ line_numbers=’false’]
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.

}
}

[/cc]

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.

[cc lang=’csharp’ line_numbers=’false’]
protected void dinamikMetod(object sender, EventArgs e)
{
Button dinamikButon = (sender as Button);
MessageBox.Show(dinamikButon.Text + ” isimli butona tıkladınız”);
}
[/cc]

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.

“Dinamik buton oluşturup kontrol etme” üzerine 18 yorum

  1. Murat hocam merhaba

    yapmakta olduğum bir proje var ve işin içinden çıkamıyorum çok sayıda butonum var ben bu butonlara belirli aralıklarda müdahale etmek istiyorum yani 42 tane butonum var ama ben örneğin buton10 ile buton25 arasına müdahale etmek istiyorum bunu for döngüsüyle buna benzer bir kodla yapmam mümkün değilmi.

    for (i = 10, i<26,i++)
    {
    button[i].text = "tarih";
    }

    foreach ile ilgili birkaç kod gördüm ama onlar bu tarz bi sınırlama getiremiyor sanırım.

    1. dostum örneği alıp denesen zaten yapmak istediğine ulaşacaksın, ısrarla yapılan örneği denemiyosun

      1. Acemilik hocam kodu yapılandırmada zorlanıyorum ondan dolayı. neticede tam da istediğim şekilde çözdüm sorunumu.

  2. tamamdır buldum ihtiyacım olanı

    (panel1.Controls[“button” + i] as Button).Text = “tarih”;

    bu şekildeymiş

  3. Murat abi benim butonları kullanıcı ekliyor.Sonra arkaplan renklerini değiştiriyor.Ben veritabanına o renkleri aktarmam gerekiyor.Nasıl yapayım? for ile hepsini sayıp arkaplan renklerine if mi yapayım? başka bir yolu varmı?

  4. Toplu kaydetmeyi biliyorum Murat abi genede sağol 🙂 ben aslında şunu sormak istemiştim:
    Ben ekrandaki her butona sormam lazım arkaplan rengin ne diye oda cevap vericek mesela kırmızı diye şimdi ben bir butona tıklandığında arkaplan rengini öğrenebiliyorum ama tıklamadan ekrandaki kırmızı arkaplanlı butonların kaç tane olduğunu nasıl sayabilirim? bu butonlar dinamikya o yüzden yani sayamadım

    1. Dostum gene aynı şekilde formda ki tüm butonları alıp içinde kırmızı renkli olanları seçebilirsin. Alltaki kodu biraz kafadan yazdım denemedim yani artansayi ile rengi kırmızı olan her butonda sayıyı arttırarak sonucu bulabilirsin.

      int artansayi=0;

      foreach (Control ktn in this.Controls)
      {
      if (ktn is Button)
      {
      if (ktn.Color=="Red")
      {
      artansayi+=1;
      }

      }
      }

  5. BABA ELİNE SAĞLIK TAM ARADIĞIM KOD BU. KURUMUN İNTERNETİ SINIRLI OLDUĞUNDAN BEĞENEMİYORUM FACE YADA TWİTTEN FALAN AMA ELİNE SAĞLIK HAKKINI HELAL ET

  6. hocam merhaba;
    ben bir proje üstünde çalışıyorum da bu oluşturduğumuz buttonların textlerini access veri tabanından çekerek nasıl değiştirebiliriz acaba? birde yeni kullanıcılar eklendikçe kendisi değişecek bu konuda beni aydınlatırsanız minnettar kalırım.

    1. btn.Text = “Buton ” yerine db den gelen değeri yazdırabilir sin. protected void dinamikMetod(object sender, EventArgs e) kısmında da kullanıcının değişeceği değeri alap db tarafına kayıt edebilirsin.

  7. Merhabalar , Bu Butonları veritabanından nasıl çekebiliriz ? üzerinde kafa patlattım ama bir türlü çözemedim yardımcı olurmusunuz…

  8. Teşekkür ederim çok işime yaradı.

    Butonları birbirine nasıl bağlayabilirim? mesela buton1 e tıklandığında buton2de tetiklenecek.

  9. bana bunun devamı lazım acil olarak ya.
    texte yazdık 50 diye ve okadar buton çıktı tamam.
    ama ekrandaki butonlardan birine tıkladıgımızda o buton kırmızı olcak ve sağa sola yukarı aşağıya dogru tek sıra yeşile döncek butonların rengi.bi kere daha tıklıcaz yine aynı şekilde olcak ve kare şeklini alınca toplamda 2 tıkla 4 tane kırmızı buton olcak . sağ sol yukarı aşağıya dogru yesil.ayrıca o oluşan kare içine sağ tarafta bitane renk katalogu olcak ve ordan seçilen renk ile o alanın rengi değişecek.

  10. Ben oluşturulan butonların modifiers özelliğinin public olmasını istiyorum ne yapmam gerekiyor ?

Bir cevap yazın

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