232-301-2136
kursat.arslan@deu.edu.tr
Buca Eğitim Fakültesi
Sosyal Bina, 2.Kat 207, İzmir
  • Ana Sayfa
  • Özgeçmiş
  • Hakkımda
  • Blog
  • İletişim
  • Ders Kayit
  • Giriş
    E-mail Adresi:
    Şifre:
İnsanlara uyanmalarını kim söylüyor füsun? Kim sabah oldu diyor onlara? Didem Madak
Son blog yazısı (3.11.2023) Bir şiir: Gitse
Dr. Kürşat ArslanDokuz Eylül Üniversitesi, Buca Eğitim Fakültesinde, Bilgisayar ve Öğretim Teknolojileri bölümünde Doçent.

C# ta çalışma zamanlı (dinamik olarak) form nesneleri oluşturma

Yayınlanma: 7 Mayıs, 2018 Güncellenme: 14 Mayıs, 2018

Bu örneğimizde c# da dinamik olarak form nesnelerinin nasıl oluşturulduğunu ve bunlara eylemlerin nasıl eklendiğini  incelemeye çalışacağız. Bu örneğimizde şu ön bilgilere ihtiyacınız olacak: random() fonksiyonunu kullanma ve for/while döngüsü ve foreach döngüsü. 

Örnek

Örneğimizde, bir butona tıkladığımızda çalışma zamanlı olarak 10 tane textbox ve 1 tane buton oluşturulacak ve butona tıkladığımızda textbox lar içerisine rasgele sayılar atanacak ve bunların toplamı ve ortalaması yine çalışma zamanlı oluşturulan bir label'e yazdırılacak. Zor gibi görünmesine rağmen adım adım kolaylıkla yapılacak bir uygulama. Önce tasarım ekranıyla başlayalım.

Tasarım Ekranı

Örneğimizde tasarım ekranında sadece bir buton ve bir panel olacak, tasarım ekranı aşağıdaki gibi düzenleyin. ! formunuza panel eklemek zorunda değilsiniz ancak bu bazı işlemlerin daha kolay yürütülmesi için size bir kolaylık sağlayabilir.

c# dinamik form nesnesi olusturma -galloglu.com

Dinamik Olarak Nesnelerin Oluşturulması

Şimdi öncelikle Başla butona tıkladığımızda, çalışma zamanlı olarak 1 tane buton ve 10 tane textbox'ın oluşmasını istiyoruz. Textbox'ları Groupboxiçerisinde oluşturursanız örneği geliştirme adına daha kolay hareket edebilirsiniz. Bunun için aşağıdaki gibi bir kod yazmamız yeterli olacaktır.

Button btn = new Button();
btn.Text = "Topla";
btn.Location = new Point(10,50);
this.Controls.Add(btn);

int i = 0;
int top = 23;
int left = 10;

do
{
    TextBox txt = new TextBox();
    txt.Location = new Point(left, top * (i + 1));
    groupBox1.Controls.Add(txt);
    i++;
} while (i < 10);

Yukarıdaki koda bölüm bölüm bakalım. Öncelikle btn değişkenine buton özelliği aktarılıyor, sıralıyla buton adı "Topla", butonun formadaki yeri x=10 (Yani butonun formun soluna olan mesafesi) y=50 (yani butonun formun üstüne olan mesafesi) ayarlanıyor. Son olarak, belirlenen özelillkleriyle btn form'a ekleniyor. !burada this'in oluşturdğunuz formu temsil etiğini unutmayın.

İkinci bölümde ise, groupbox'ın içine ekleyeceğimiz 10 adet textbox için oluşturulacak döngüde gereken değişkenler belirleniyor. Burada ben do while kullandım ancak siz bunu farklı döngü yapılarıylada deneyebilirsiniz. bu bölümde i döngü için, top ve left ise değişkenleri textboxlar içinde yer belirlemede kullanacağız.

yukarıdaki kod bloğunda yer alan son bölümde ise, döngü oluşturuluyor ve 10 adet textbox oluşturuluyor. ! burada dikkat etmeniz gereken nokta butonları alt alta eklemek istediğim için sadece y değerini yani bu örnek için top değerini her seferinde belli ölçüde artırmak. Ben burada i değişkeni ile top değişkenini çarparak her seferinde 23 birim aşağı gitmesini sağladım. Siz bunu istediğiniz gibi artırıp azaltabilirsiniz.

Çalışma Zamanlı Oluşturulan Nesnelere Olay Eklenmesi

Şimdi çalışma zamanlı oluşturduğumuz "Topla" isimli butona bir olay eklememiz gerekiyor. Bunun için yukarıdaki kodun birinci bölümüne "this.Controls.Add(btn);" satırından önce aşağıdaki kod satırını eklemeniz yeterli olacaktır.

btn.Click += new EventHandler(topla);

şimdi topla isimli bir fonksiyon oluşturmamız ve gerekli kodları eklememiz gerekiyor.

Fonksiyon Oluşturma

Burada önemli olan nokta, fonksiyon içerisinde parametre olarak (object sender, EventArgs e)'nin eklenmesidir. Kalan kısım önceki açıklamalarıma göre kolaylıkla anlaşılabilir. Öncelikle birince bölümde, yine dğeişkenler oluşturuluyor, ikinci bölümde groupbox içerisinde oluşturuduğumuz textbox'lara tek tek ulaşarak 0 ile 99 arası bir değer atanıyor ve atanan bu değer sayı değişkeninde toplanıyor. Ve son olarak yine çalışma zamanlı bir label eklenerek bunun text değerine toplam ve ortalama değerleri yazılıyor. Hepsi bu kadar. Umarım kolayca yapabilirsiniz.

void topla(object sender, EventArgs e) {
    Random rnd = new Random();
    int sayi = 0;
    int rst = 0;

    foreach(Control abc in groupBox1.Controls)
    {
        rst = rnd.Next(100);
        abc.Text = rst.ToString();
        sayi += rst;
    }

    Label lbl = new Label();
    lbl.Text = "Toplam: " + (sayi).ToString()
                +"\n"+"Ortalama: "+ (sayi / 10).ToString();
    lbl.Location = new Point(groupBox1.Left,groupBox1.Top+groupBox1.Height);
    lbl.AutoSize = true;
    this.Controls.Add(lbl);
}

Son Ekran

Eğer yukarıda verilen bütün kodları doğru bir şekilde yazarsanız aşağıdaki gibi bir son ekran elde edeceksiniz. Başlat'a tıkladığınızda önce topla butonu ve textbox'lar oluşacak, sonra Topla butonuna tıkladığınızda rasgele sayılar oluşacak ve bu sayıların toplamı ve ortalaması label'e yazdırılacak.

! unutmayın. Bu örneği sayfadan bakarak yaptıktan sonra bakmadan yeniden yapmalısınız, böylece kesin olarak yapı aklınızda kalabilir. Örnekle ilgili yorumlarınızı bekliyorum.

Bu gibi yazıların çoğalması için site içerisinde yer alan reklama tıklayın. Teşekkürler :)

Bir Yorum Bırak

    Bu yazıya şimdiye dek yapıldı.
  • Avatar
    Muhammed Zengin 11 ay önce
    Kürşat hocam örnek için çok teşekkür ederim. Bir noktada takıldım. Sizinkine benzer bir şekilde örnek yaptım. Belirtilen sayıda Combobox ürettim. Her Combobox'ı veritabanında personel isimli bir tabloda olan isimlerle doldurdum. Mesela 5 adet Combobox ürettim personel tablosunda kayıtlı 80 kişiyi comboboxa aktardım. Combobax'dan 5. kaydı seçtiğimde(Örn. Kürşat Arslan) bunun değerini bir textboxa aktarmak istiyorum. Normal sürükle bırak tasarımda bu işlem gayet kolay. text1.text=combobox1.SelectedValue.ToString(); gibi .bir ifade ile aktarabiliyoruz  ancak dinamik olarak oluşturduğumuz ve veriler ile doldurduğumuz combobox'dan seçtiğimiz veriyi nasıl textbox'a aktaracağız. Bir yol gösterirseniz çok sevinirim. 
  • Avatar
    Kürşat Arslan 12 Mayıs, 2023 15:08:16

    Muhammed merhaba, bildiğin üzere çalışma zamanlı oluşturduğun bir nesneye olay aktarmak aşağıdaki gibi bir kod yazman gerek:

            a.Click += new EventHandler(tikla);

    yukarıdaki kod a nesnesinin click olayına tıkla fonksiyonunu atıyor. Sende benzer bir kodu sürükle bırak için ekleyebilirsin. 

    burada tıkla fonksiyonunun içeriği aşağıdaki gibi olabilir. Bu kod senin işini görebilir. 

            void tikla(object sender, EventArgs e)
            {
                text1.text=(sender as Combobox).SelectedValue.ToString();
            }

     

  • Avatar
    fsafa 10/16/2022 13:27:33
    program ekranında 1 adet bilgi girişi yapılan textbox kutusu ve bir buton yer almakta 
    sayısal 3 adet değerimiz var başlangıçta bütün değerler 0 dır 
    butona ilk tıklandığında birinci sayıyı textbox kutusu içinde yazılan değer yapan
    butona ikinci tıklandığında ikinci sayıyı textbox kutusu içinde yazılan yeni değer yapan 
    butona üçüncü tıklandığında üçüncü sayıyı textbox kutusu içinde yazılan yeni değer yapan algortitmayı yazınız
    yardımcı olur musunuz 
  • Avatar
    Kürşat Arslan 19 Ekim, 2022 10:39:04

    fsafa merhaba, ne yazık ki bu tür ödev sorularına cevap vermiyorum. 

  • Avatar
    zeynep 12/3/2021 10:37:07
    anlattığınız hiç bişey dersimle allakası yok
  • Avatar
    Kürşat Arslan 7 Aralık, 2021 19:32:46

    Zeynep, benim zaten böyle bir iddam yok. C# ta çalışma zamanlı form nesneleri bu şekilde oluşturulur, ancak dersinizde ne gördünüz ya da aynı konu ise neden farklı onu bilmiyorum :)

  • Avatar
    Murat 3/14/2021 20:23:37
    Merhaba form çalışır durumda dinamik nesneler oluşturuluyor.Peki formda yaptığımız işlemlerin kaydedilmesi için ne yapmalıyız.Ornegin dinamik olarak 10 buton oluşturduk.Daha sonra butonlar kaydedilsin.Form yeniden başlayınca butonlarda orada olsun.
  • Avatar
    Kürşat Arslan 14 Mart, 2021 21:03:02

    merhaba, bunu yapabilmek için ya veri tabanı kullanacaksınız ya da bir txt dosyası içerisinde bilgileri saklayacaksınız. Ya da son seçenek olarak xml dosyasında bütün bilgileri tutup, programı açarken o dosyayı okuyup formu yeniden oluşturabilirsiniz. 

  • Avatar
    Murat 14 Mart, 2021 21:30:15

    Vermiş olduğunuz bilgiler için teşekkür ederim. Güzel bir çalışma olmuş.

  • Avatar
    Emre inci 1/21/2021 05:00:49
    Oluşturulan textboxlardan mesele 3. Textboxa form açıldığında otomatik tıklama eventi nasıl eklenir
  • Avatar
    ilgice 12/3/2020 02:41:45
    ben textbox yerine label oluşturdum ve accesten 400 adet veri çektim, tabi her veri için 4 adet alan çektim yani yan yana 4 tane alt alta 400 tane label ancak sistem çok yavaşladı 4 çekirdek pc 8gb ram var yinede pc takıldı left ve top ayarlarken kullanılan Point sebep oluyor sanırım buna bir çözüm var mı?
  • Avatar
    Mehmet 5/13/2020 08:38:36
    Hocam merhabalar benimde size bir sorum olacak bilgisayar programcılığı okuyorum ve ödev olarak verilen bir konu var form genişletme ile alakalı mail bırakırsam yardımcı olabilir misiniz
  • Avatar
    Nur akish 12/16/2019 00:42:34

    Bir şey soracaktım buttonunu yanına textbox koysak o textbox içinde her  hangi bi sayı (100 varsayarak) 
    listtextbox ta  100 nokta çıkması gerek  
    bunu nasıl yapıcaz. ?

  • Avatar
    Kürşat Arslan 16 Aralık, 2019 16:02:20

    Nur, anladığım kadarıyla sorunu cevaplamaya çalışayım. Şimdi aşağıdaki kod listbox içerisinde kaç tane textbox olacağını belirliyor.

    do
    {
        TextBox txt = new TextBox();
        txt.Location = new Point(left, top * (i + 1));
        groupBox1.Controls.Add(txt);
        i++;
    } while (i < 10);

    Bu kod bloğunda gördüğün üzere "while (i<10)" kodu sadece 10 tane textbox oluşturulacağını söylüyor. Eğer bu kod içerisinde, "10" yerine formda bir textbox oluturup içerisinde yazan değeri kullanırsanız, o kadar textbox oluşturabilirsiniz.  

  • Avatar
    Sibel 12/10/2019 12:52:26
    Ne kadar güzel anlatmışsınız Yazılım Mühendisi olmayıp ancak bu ise cok heves ve 37 yaşından sonra yazılım öğrenmeye başlayan biri için bile o kadar anlaşılır ve net ki. Araştırma yaparken sayfanıza tesadüfen rastladım iyi ki de rastlamışım. Yazılım öğrenme aşamasında sayfanız çok işime yarayacak. Elinize, kolunuza sağlık. Teşekkürler
  • Avatar
    Kürşat Arslan 10 Aralık, 2019 13:05:54

    Sibel Hanım yorumlarınız için teşekkürler. Bu yolda size başarılar dilerim. Programlama zor gibi görünsede yeterince merak ve motivasyonla, oldukça zevkli ve eğlenceli olabilir. Sorunuz olursa lütfen çekinmeyin. 

  • Avatar
    Kadir 10/13/2019 18:04:20
    Merhaba,
    Öncelikle emeğinize sağlık.

    Butona tıklayınca combobox ve textbox oluşturuyorum.
    Combobox'a veritabanından veri çekmek ve textboxa kullanıcı tarafından girilen verinin veritabanına eklenmesini sağlamak istiyorum.
    Bunu nasıl sağlayabilirim.
    Teşekkürler
  • Avatar
    Kürşat Arslan 14 Ekim, 2019 21:29:49

    Kadir Merhaba

    C#'da SQL Server dan veri tabanı bağlatısı yapma ve diğer işlemleri (listeleme, ekleme, kaydetme,silme) gerçekleştirme konusudunda en kısa zamanda bir yazı ekleyeceğim. Bunu yaptığımda, sana mail atabilirim. Ancak şu an en kısa cevabı: 

    1. Öncelikle SqlConnection oluşturmalısın
    2. Daha sonra SqlCommand ile veri tabanında verileri isteğin SQL komutu ile alacaksın
    3. Sonra SqlDataReader ile komutu çalıştıracaksın
    4. ve son olarak DataTable ile veri tablosu oluşturarak combox'a ekleneiblir

    Örnek kod aşağıdaki gibi olabilir:

    SqlConnection conn = new SqlConnection(@"Data Source=TOM-PC\sqlexpress;Initial Catalog=Northwind;User ID=örnek;Password=örnek") ;
    conn.Open();
    SqlCommand sc = new SqlCommand("select * from musteri", conn);
    SqlDataReader reader;
    
    reader = sc.ExecuteReader();
    DataTable dt = new DataTable();
    dt.Columns.Add("musteriID", typeof(string));
    dt.Columns.Add("musteriIsim", typeof(string));
    dt.Load(reader);
    
    comboBox1.ValueMember = "musteriID";
    comboBox1.DisplayMember = "musteriIsim";
    comboBox1.DataSource = dt;
    
    conn.Close();

    kaynak: https://social.msdn.microsoft.com/Forums/en-US/9387c998-3373-4d58-85dc-87bb9234e108/how-to-fill-combo-box-from-database-using-c?forum=csharplanguage

  • Avatar
    Kadir 14 Ekim, 2019 22:02:58

    Hocam kendimi yanlış ifade ettim.Üzgünüm.
    Aslında sql'e veri ekleme bölümünde problemim yok. Prosedürler oluşturup ekleme ve listeleme yapabiliyorum. Fakat c# tarafında dinamik olarak oluşturulan nesneleri, yine sql tarafında oluşturulacak olan dinamik kolonlara eşleştirmek istiyorum. Bu işlemin biraz zor ve karmaşık olduğunun farkındayım. Fakat yinede araştırmak istedim.
    İlginiz için teşekkürler.

Bu site Galloglu.com üzerinden, öğrencilerim ve diğer ilgili herkes için online içerik geliştirme amaçlı tasarlanmıştır. Özellikle SPSS ve ARDUINO blog yazıları, sizin bu konuları örnekler üzerinden daha iyi anlamanız için basitleştirilerek anlatılmıştır. Sitede yer alan içerikler, düzenli olarak kontrol edilerek hatalardan kaçınılmaya çalışılmaktadır, diğer taraftan bilgilerin tümüyle doğruluğu garanti edilemez.
Designed and Created by Kursat Arslan. Copyrigt © 2016-2024
Bu site Kürşat Arslan tarafından tasarlanmış ve geliştirilmiştir.
Bütün hakları saklıdır.Sitede yer alan bütün içerikler galloglu.com'a aittir.