232-301-2136
kursat.arslan@deu.edu.tr
Buca Eğitim Fakültesi
Sosyal Bina, 2.Kat 207, İzmir
  • Ana Sayfa
  • Hakkımda
  • Blog
  • İletişim
  • Ders Kayit
  • Giriş
    E-mail Adresi:
    Şifre:

Toprakta gezen gölgeme toprak çekilince, Günler şu heyûlâyı da, er geç silecektir. Rahmetle anılmak… Ebediyet budur, amma, Sessiz yaşadım, kim, beni nerden bilecektir?

Mehmet Akif Ersoy
Proje: Enhancing Digital Literacy of University Students (E-DigiLit) Kürşat Arslan tarafından eklenen son blog yazısı (10.09.2019)
Kürşat ArslanDokuz Eylül Üniversitesinde Dr. Öğretim Üyesi olarak çalışıyorum. SPSS ve Arduino özel ilgi alanım.

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.

! Eğer bu yazı sizin için faydalı olduysa reklama tıklayıp destek olabilirsiniz

Bir Yorum Bırak

Bu yazıya şimdiye dek yapıldı.

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.

Kadir 13 Ekim, 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

Kürşat Arslan14 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

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-2019 I love ASP, SQL and Google.
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.