Merhaba, C# Dinamik Button ve Dinamik Düzen dersi ile C# eğitim setime devam ediyorum. Bu dersimizde C# ile textbox’a girdiğimiz düzene göre dinamik buttonlar üreten ve yerleştiren bir uygulama yapacağız. Buna ek olarak iki görsel efekt ekleyeceğiz.
C# Dinamik Button ve Dinamik Düzen
C# dinamik button konusunda bir dersim zaten vardı ancak bu ders biraz daha farklı olacak. Textbox’tan girilen bir düzene göre buttonları bir panel içerisine ekleyeceğiz. Örnek vermek gerekirse, diyelim ki bir sinema salonu ya da bir otobüs koltuk düzenimiz olsun. Bu tarz belirli koltuk düzenine uyacak bir tasarımı otomatik olarak gerçekleştireceğiz.
Dinamik Nesneler ile ilgili derslerim.
Tabi buna ek olarak, konu ile alakasız olsa da dinamik eklenen button nesneleri üzerinden görsel olarak iki işlem daha yapacağız. Uygulamanın çalışma şekli aşağıdaki videodaki gibidir.
C# Dinamik Button ve Dinamik Düzen
Şimdi formumuza 2 textbox, 3 button, 1 label, 2 radiobutton, 1 timer ve 1 panel ekleyelim. Form tasarımı aşağıdaki gibidir.
Şimdi burada yapılacak işlem sol üst kısımdaki textbox’ta yer alan * ‘ların duruşuna göre panelde buttonlar otomatik yerleşecek.
Değişkenlerimiz,
int i = 0, ii = 0, sayac = 0; Button btn;
private void btn_olustur_Click(object sender, EventArgs e) { DuzenKur(); } void DuzenKur() { int say = 0; panel1.Controls.Clear(); int olcu = 38; for (int i = 0; i < txt_duzen.Lines.Count(); i++)// textbox satırları arasında { for (int j = 0; j < txt_duzen.Lines[i].Count(); j++) // bir satırdaki karakterler arasında { string satir = txt_duzen.Lines[i]; // bir satırı aldık if (satir[j] == '*') // satırdaki j index'ine denk gelen ifade * ise { Button nesne = new Button(); nesne.Name = "buton" + i; nesne.Text = (++say).ToString(); nesne.BackColor = Color.Red; nesne.Width = nesne.Height = 33; nesne.Left = olcu * j;// butonun nerede duracağı nesne.Top = olcu * i; // butonun nerede duracağı panel1.Controls.Add(nesne); nesne.Click += koltukSecildi; } } } }
Button oluştur click eventi ve DuzenKur metodumuz…
Burada, Textbox satırları ve satırlardaki karakterler arasında döngülerimiz var. Satırdaki karakterler arasında dönerken karakter eğer * ise bir button ekleniyor. Button nesnesinin Left ve Top özelliklerini döngüler üzerinden aldığımız için * olmayan kısımlar boş bırakılmış oluyor. Yani aslında biz buttonların nerede duracaklarını söylüyoruz.
Button nesnesinin Left özelliğine ekleme yaparak satırda soldan nerede nerede duracağını, Top özelliğine ekleme yaparak yukarıdan ne kadar aşağıda duracağını belirliyoruz.
Burada button nesneleri 33X33 pikseldir. Bırakılan boşluklar ise 38 pikseldir. Bu da yan yana gelen button nesneleri arsında 5 piksellik boşluk bırakılacak anlamına geliyor.
Şimdi button nesnelerimizin click eventlerini ayarlayalım. Burada asıl amaç koltuk düzeni olduğundan buttona tıkladığımız rengini değiştirip, Rezerve edildiğini temsil edeceğiz.
void koltukSecildi(object sender, EventArgs e) { Button btn = (Button)sender; if (btn.BackColor == Color.Red) btn.BackColor = Color.Aqua; else btn.BackColor = Color.Red; }
Bu metot ile tıklanan button nesnesinin arka plan rengini değiştiyoruz. Aslında projemiz burada bitiyor. Buradan sonrası öylesine yapılmış şeylerdir. :) Videodaki gibi sırayla otomatik renk değiştirilmesini yapacağız.
Şimdi Renklendir ve Durdur button nesnelerimizin click eventlerini verelim.
private void btn_renklendir_Click(object sender, EventArgs e) { i = 0; ii = panel1.Controls.Count - 1; sayac = 0; timer1.Interval = Convert.ToInt32(txt_salise.Text); timer1.Enabled = true; } private void btn_durdur_Click(object sender, EventArgs e) { i = 0; ii = panel1.Controls.Count - 1; sayac = 0; timer1.Interval = Convert.ToInt32(txt_salise.Text); timer1.Enabled = false; DuzenKur(); }
Burada değişkenleri sıfırlayıp timer’in intervalini ayarlıyoruz.
İki işlemimiz var. Bir sıradan yakma iki bir sondan bir baştan yakma. Şimdi o metotları verelim.
void BirbastanBirsondan() { try { btn = panel1.Controls[i] as Button; btn.PerformClick(); i++; } catch (ArgumentOutOfRangeException) { i = 0; } try { btn = panel1.Controls[ii] as Button; btn.PerformClick(); ii--; } catch (ArgumentOutOfRangeException) { ii = panel1.Controls.Count - 1; ; } } void Sıradan() { btn = panel1.Controls[i] as Button; btn.PerformClick(); i++; }
BirbastanBirsondan() metodumuzda, i ve ii değişkenlerini kullanıyoruz. Panel’e eklenen kontrollerin hepsi button olduğundan yaptığımız atamada bir sorun yaşamıyoruz. Atamayı yapılan button’un performClick metodu ile kod ile butona tıklıyoruz. i değişkeni 0 dan başlayıp artıyor, ii değişkeni de eklenen button sayısından başlayıp azalıyor. Böylece bir sondan bir baştan buttonlara tıklayarak renklerini değiştiriyoruz.
Sıradan(), metodumuzda da ilk buttondan başlayarak sırayla buttonlara tıklıyoruz.
Şimdi bu kodların çalışmasını sağlayan kısma geldik. Timer nesnesinin Tick eventine… Timer’in interval özelliğini 10 olarak ayarladığımzıdan olabileceği en hızlı şekilde buttonlara sıra ile tıklayacak.
private void timer1_Tick(object sender, EventArgs e) { if (radioButton1.Checked == true) { if (sayac < panel1.Controls.Count) { BirbastanBirsondan(); } else { sayac = 0; i = 0; ii = panel1.Controls.Count - 1; } sayac++; } if (radioButton2.Checked == true) { if (sayac < panel1.Controls.Count) { Sıradan(); } else { sayac = 0; i = 0; } sayac++; } }
Burada ek olarak, tıklanan button, panel’e eklenen control sayısına ulaştığında sıfırlanmasını ve baştan başlamasını istedik. Bu şekilde durmadan buttonların renkleri değişiyor.
Projenin tamamı bu kadardı. Aşağıda formdaki tüm kodları tek seferde veriyorum.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace DinamikButtonDuzeni { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int i = 0, ii = 0, sayac = 0; Button btn; private void Form1_Load(object sender, EventArgs e) { } private void btn_olustur_Click(object sender, EventArgs e) { DuzenKur(); } void DuzenKur() { int say = 0; panel1.Controls.Clear(); int olcu = 38; for (int i = 0; i < txt_duzen.Lines.Count(); i++)// textbox satırları arasında { for (int j = 0; j < txt_duzen.Lines[i].Count(); j++) // bir satırdaki karakterler arasında { string satir = txt_duzen.Lines[i]; // bir satırı aldık if (satir[j] == '*') // satırdaki j index'ine denk gelen ifade * ise { Button nesne = new Button(); nesne.Name = "buton" + i; nesne.Text = (++say).ToString(); nesne.BackColor = Color.Red; nesne.Width = nesne.Height = 33; nesne.Left = olcu * j;// butonun nerede duracağı nesne.Top = olcu * i; // butonun nerede duracağı panel1.Controls.Add(nesne); nesne.Click += koltukSecildi; } } } } void koltukSecildi(object sender, EventArgs e) { Button btn = (Button)sender; if (btn.BackColor == Color.Red) btn.BackColor = Color.Aqua; else btn.BackColor = Color.Red; } private void timer1_Tick(object sender, EventArgs e) { if (radioButton1.Checked == true) { if (sayac < panel1.Controls.Count) { BirbastanBirsondan(); } else { sayac = 0; i = 0; ii = panel1.Controls.Count - 1; } sayac++; } if (radioButton2.Checked == true) { if (sayac < panel1.Controls.Count) { Sıradan(); } else { sayac = 0; i = 0; } sayac++; } } void BirbastanBirsondan() { try { btn = panel1.Controls[i] as Button; btn.PerformClick(); i++; } catch (ArgumentOutOfRangeException) { i = 0; } try { btn = panel1.Controls[ii] as Button; btn.PerformClick(); ii--; } catch (ArgumentOutOfRangeException) { ii = panel1.Controls.Count - 1; ; } } void Sıradan() { btn = panel1.Controls[i] as Button; btn.PerformClick(); i++; } private void btn_renklendir_Click(object sender, EventArgs e) { i = 0; ii = panel1.Controls.Count - 1; sayac = 0; timer1.Interval = Convert.ToInt32(txt_salise.Text); timer1.Enabled = true; } private void btn_durdur_Click(object sender, EventArgs e) { i = 0; ii = panel1.Controls.Count - 1; sayac = 0; timer1.Interval = Convert.ToInt32(txt_salise.Text); timer1.Enabled = false; DuzenKur(); } } }
Hepsi bu kadardı arkadaşlar.
C# Dinamik Button ve Dinamik Düzen yazımda bu kadar arkadaşlar.
Bana destek olmak isterseniz, iletişim sayfamda verdiğim sosyal medya hesaplarımı takip edebilirsiniz.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme bu bağlantıdan ulaşabilirsiniz… Bu projeyi Drive’a yükledim. Bağlantıya tıklayarak indirebilirsiniz.
Bu yazı, sitemdeki 437. yazıdır…
Sağlıcakla ve takipte kalın. ;)
Dinamik olarak oluşturulan nesneleri forma nasıl kaydederiz.
nesnelerin bilgilerini bir yere kaydetmeniz gerekir. Bir veritabanı ya da bir metin metin dosyasına…
Her nesnenin özellikle eklenen name, text, size ve location özelliklerini tutmanız gerekir. Diyelim ki metin belgesine yazdınız. Bu form açılırken, hazırlanan metin belgesini okuyup içeriğindeki bilgilere göre aynı nesneleri tekrar üretmeniz gerekir. Bende daha önce böyle bir konu ile uğraşmıştım ve bu şekilde çözmüştüm. Ama söylemeliyim ki performansı bir çözüm değildir