1. Ana Sayfa
  2. C Sharp

C# Dinamik Nesne Oluşturma ve Forma Ekleme

C# Dinamik Nesne Oluşturma ve Forma Ekleme
C# Dinamik Nesne Oluşturma ve Forma Ekleme
+ - 0

C# Dinamik Nesne Oluşturma ve Forma Ekleme, dersimiz ile eğitimlerimize devam ediyoruz. Bazen öyle projelerimiz oluyor ki, ihtimalleri düşündüğümüzde forma yüzlerce buton eklememiz gerekiyor. İhtimallere göre butonlar gizle/göster yaparak bir şekilde çözmeye çalışıyoruz. Ancak ya form açılışından hiç buton olmasa ve yapılan işlemlere göre program çalışırken ekrana butonları sıfırdan oluşturup eklesek / silsek nasıl olur?. İşte bu dersimizde de bunu göreceğiz. Program çalışırken belirli şartlara göre ekrana buton ekleyip eventlerini kullanacağız. Hadi gelin C Sharp Dinamik Nesne Oluşturma ve Forma Ekleme nasıl oluyormuş görelim.

C# Dinamik Nesne Oluşturma ve Forma Ekleme

Formumuza 10 tane buton ekleyelim. Önceki derslerimde de dediğim gibi ben devexpress kullandığımdan dolayı oluşturduğum nesneler de devexpress nesneleri olacaktır. Ancak üzülmenize gerek yok aynı şekilde windows nesneleri de oluşturabilirsiniz. Nesneler farklı olsa sonuçta C#.. O yüzden sorun yok. ;)

SimpleButton bir devexpress nesnesidir. SimpleButton’u Button olarak değiştirirseniz kodlar çalışır.

SimpleButton btn = new SimpleButton()
                {
                    Height = 130,
                    Width = 250,
                    Text = "Dinamik Buton"
                    Name = "btn_1",
                    Font = new Font("Microsoft Sans Serif", 9, FontStyle.Bold),
                };

Bu kodlar ile kod olarak bir buton oluşturduk. Ancak daha forma eklemedik. Oluşturduk ve bekliyor.

Eklemek bu kodumuzdan daha kısa. İşte ekleme kodu…

this.Controls.Add(btn);

Buton ekleme işlemi bu kadar basit arkadaşlar. Bu şekilde diğer nesneleride ekleyebilirsiniz.

Tabi bu yazdığımız kodlar bir tane nesne ekleyecektir. Bize on tane buton lazım olsun.

İlk iş olarak buton ekleme kodlarımızı bir voide aldık ve 10 kere dönecek bir for döngüsünün içerisine aldık. Bu for döngüsünü de Form_Load eventi içerisine koyduk ki form açıldığı anda ekrana 10 tane buton gelsin.

 private void DinamikButton_Load(object sender, EventArgs e)
        {
            butonEkle();
        }
        void butonEkle()
        {
            panelControl1.Controls.Clear();

            for (int i = 0; i < 10; i++)
            {

                SimpleButton btn = new SimpleButton()
                {
                    Height = 100,
                    Width = 200,
                    Text = "Dinamik Buton " + (i + 1).ToString(),
                    Name = "btn_" + (i + 1).ToString(),
                    Font = new Font("Microsoft Sans Serif", 9, FontStyle.Bold),
                };
                panelControl1.Controls.Add(btn);
            }

        }

100×200 olarak formumuza 10 tane buton ekledik. Projeyi build ettiğimizde ekranda bir tane buton görünecektir. Bunun sebebi tüm butonları üst üste koyması. Çünkü buton ekleme kod bloğumuzda, buton için location belirlemedik. Şimdi bu işlemi yapmadan önce mantığına bir değinelim.

 

C Sharp Dinamik Nesneleri Konumlandırmak

Öncelikle çok fazla buton ekleme işlemlerinde direk formun içerisine nesne eklemek, nesnelerin location larını belirlemede bize sorun çıkarabiliyor. Bu gibi işlemler için en uygun nesne panel nesnesidir. Formumuza bir panel ekleyelim ve dock özelliğini fill yapalım. İkinci bir hususta nesneleri alt alta yada yan yana ekledik diyelim ancak bu seferde nesneler formun dışına taşacaktır. Bu sebeple bir dizi işlem ile nesneleri ekran boyutları içerisinde kalacak şekilde piksel hesaplaması yapıp location özelliğini ayarlamalıyız. Şimdi yukarıdaki kodlarımızı aşağıdaki gibi düzenleyelim.

private void DinamikButton_Load(object sender, EventArgs e)
        {
            butonEkle();
        }
        void butonEkle()
        {
            panelControl1.Controls.Clear();

            int EklenenButonlar_Height = 0;
            int Soldan = 0, Ustten = 0;

            for (int i = 0; i < 10; i++)
            {
                SimpleButton btn = new SimpleButton()
                {
                    Height = 100,
                    Width = 200,
                    Text = "Dinamik Buton " + (i + 1).ToString(),
                    Name = "btn_" + (i + 1).ToString(),
                    Font = new Font("Microsoft Sans Serif", 9, FontStyle.Bold),
                };

                panelControl1.Controls.Add(btn); 
                // Panel içine butonu Ekledik.
                // butonun nerede duracağını ekleme işlemini yaptıktan sonra belirleyebiliriz.
                // mantıken düşündüğümüzde eklenmemiş bir nesnenin konumunu ayarlayamayız.

                Ustten = (btn.Height * (EklenenButonlar_Height / btn.Height));
                // dikeyde eklenen butonların yüksekliklerinden yola çıkarak, üstten bırakılacak boşluğu buluyoruz                

                EklenenButonlar_Height += btn.Height; 
                // eklenen butonların dikeyde toplam boyutu kaç piksel?
                // bu değeri, panel yüksekliği  ile dikeyde eklenen butonların toplam yüksekliği değerlerini karşılaştırdıktan sonra
                // dikeyde yer kalmadıysai, sağına geçip devam etmesi için alıyoruz.

                switch (EklenenButonlar_Height > panelControl1.Height) 
                    // butonların boyutu ekrana sığmıyorsa?
                {
                    case true:
                        Ustten = 0; 
                        // en üstten başla

                        Soldan += btn.Width;  
                        // soldan buton genişliği kadar boşluk bırak.
                        // bir stun boyunca ekledikten sonra sağına geçip devam edecek
                        // ama soldan kaç pksel boşluk bırakacak onu burada belirliyoruz.

                        EklenenButonlar_Height = btn.Height; 
                        // ikinci stuna geçtiğimizden dolayı sıfırladık
                        break;
                }
                btn.Location = new Point(Soldan + 10, Ustten + 10); // konumunu ayarladık
                // dediğimiz gibi buton eklendikten sonra konumu ayarlanabilir.
            }

        }

Kodlar üzerinde açıklamaları verdim. Yine de kısaca değinmek gerekirse;

1 – Butonu oluşturduk.

2 – Butonu forma ekledik

3 – Forma eklenen butonun konumu diğer butonların konumlarına göre ayarladık.

Evet, yaptığımız işlemler bu kadar. Buradaki ekleme şeklini kendim oluşturdum. Bundan önceki bir kaç projemde de yapmıştım ama onları aramak için harcayacağım zamanda yeniden yaparım diye düşündüm. Öyle de oldu ama çok farklı bir yöntemde oldu. Önceki yaptıklarımda soldan sağa ekliyor bir satırda yer kalmadıysa aşağı inip devam ediyordu. :D

Şöyle bakıyorum da bir zamanlar ütopya gibi gelen bu işlem şimdi çocuk oyuncağı gibi geliyor. ;)

Buraya kadar bir sıkıntımız yok. Şimdi asıl iş burada başlıyor. Her butonun farklı bir iş yapmasını istiyorsak…..   Farklı dediğime aldanmayın. Yine benzer işler olacaktır. Yani dinamik eklediğiniz butonlarda biri kaydetme yapsın, biri silme yapsın, biri temizleme yapsın derseniz bu yöntem sıkıntılı olur. Olmaz değil olur ama çoook uğraşırsınız.

 

Dinamik Nesnelere Event Atamak

Bu işlemi aşağıdaki yada ona benzer işlemlerde kullanabilirsiniz;

1 – Bir üretim takip projesinde çalışan, çalışmayan yada arızalı makinaları gösterebilirsiniz. Veri tabanından aldığınız verilere göre, dinamik butonlar ekleyerek, makina ismi vererek ve durumuna göre backcolor vererek hoş bir takip ekranı yapabilirsiniz.

2 – Bir market programında, eklenen ürünleri dinamik butonlar ile ekranın bir kenarında gösterebilir, kullanıcı bu ürünleri temsil eden butonlara tıklayıp, ürünü sepete ekleme işlemi yaptırabilirsiniz. vs. vs.

Bizde şimdi yukarıdaki örneklerden market programı gibi olanı kullanalım. Butonlarımızın text özellikleri ürün adları, name özellikleri ise ürün kodları olsun. Hangi butona tıklarsak, o butonun name ve text özelliklerini bir messagebox ile gösterelim.

   btn.Location = new Point(Soldan + 10, Ustten + 10); // konumunu ayarladık
   // dediğimiz gibi buton eklendikten sonra konumu ayarlanabilir.

satırının hemen altına şu kodu ekleyelim.

 btn.Click += Btn_Click;

bu kod ile eklediğimiz butonlara click eventi atamış olduk. (delegate).

btn.Click += yazdıktan sonra event oluşturmak için tab tuşuna basın diye bir bilgi verecek. Tab tuşuna basarsanız event otomatik oluşturulacak.

  private void Btn_Click(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }

Aynen bu şekilde. Şimdi bu eventi aşağıdaki gibi düzenleyelim.

 private void Btn_Click(object sender, EventArgs e)
        {
            SimpleButton btn = sender as SimpleButton;
            MessageBox.Show("Text: " + btn.Text + " - Name: " + btn.Name);
        }

Bu açıklamaya dikkatinizi verin.

Burada elimize bir simplebutton aldık içi boş bir buton. Sonra dedik ki bu boş kutuya, hangi butona tıklarsak o butonu koy.

Yani kısmende olsa dinamik buton oluşturma söz konusu. Burada elimizdeki butona, tıkladığımız butonun tüm özelliklerini aktarmış olduk. Şimdi elimizdeki boş buton dolduğundan btn ile tıklanan butondaki tüm özellikleri kullanabiliriz. MessageBox’ta da gördüğünüz gibi, text ve name özelliklerini yazdırdık. Bu MessageBox’ta hangi butona tıklanılırsa o butonun text ve name ‘i yazacak.

Bundan sonrası da size kalmış. İstediğiniz şekilde kullanabilirsiniz. Ben genelde (örnek üzerinden gidiyorum), butonun name özelliğine ürünün kodunu yazar, tıklandığında hangi ürünün seçilmiş olduğunu o kod sayesinde anlamış olurum.

 


C Sharp Dinamik Nesne Oluşturma ve Forma Ekleme , yazımız da bu kadar dostlar. Diğer derslerimizde görüşmek üzere.

C Sharp Eğitim Seti ve ERP Programlama ders listesi için tıklayınız.  Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz…

Takipte ve Sağlıcakla Kalın. ?

Bu yazıya tepkiniz ne oldu?

Yazar Hakkında

Lise Ağ Sistemleri ve Yönetimi bölümü, üniversite Bilgisayar Programcılığı bölümü Ön Lisans, Yönetim Bilişim Sistemleri Lisans öğrenimi aldım. Askerlik görevimi tamamladım. Uzmanlık alanım; C# ve SQL Programlama dilleri ile müşteri odaklı, kullanıcı dostu ERP ve CRM gibi sistemleri geliştirmektir. Ayrıca şuanda PHP ve MYSQL alanında projeler geliştirmekteyim. C++, Phyton, Xamarin, MVC gibi konuları öğrenmek ve kendimi geliştirme çabası içerisindeyim. Discord için: https://discord.gg/FBxZeHu9

Değerli yorumlarınızı bekliyorum. :)