Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Sefer Algan
Sefer Algan
http://www.seferalgan.com
İletişme geçmek için tıklayın.
71 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  C# / VC#/.NET Sefer Algan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 26.4.2003
Okunma Sayısı : 41704
Yorum Sayısı : 4     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 10.8.2022
Turhal Temizer
Mac OS/X Removing CUDA 10.8.2022
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
.NET'te Dinamik Kontrol Oluşturma
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Bu yazıda windows ve web uygulamalarında dinamik kontrollerin nasıl oluşturulacağını ve oluşturulan dinamik kontrollere erişim yöntemlerini inceleyceğiz. Ayrıca bu yazıda dinamik kontrol oluşturma ile ilgili kapsamlı bir örnek kod yeralmaktadır.

Bir çok uygulamada(özellikle oyunlarda) kontrollerimizin sayısını tasarım aşamasında bilemeyebiliriz. Örneğin hepimizin bildiği mayın tarlası oyununda, oyun alanı bir çok kareden oluşmaktadır. Üstelik oyun alanı, kullanıcının isteğine göre değişebilmektedir. Eğer tasarım aşamasında bütün kontroller form üzerine yerleştirilşmiş olsaydı hem bu kontrollerin yönetimi zorlaşacaktı hemde gereksiz yere bir çok kod yazılmış olacaktı. Buna benzer bir durum web formları ile programlama yaparken de görülebilir. Örneğin bir anket sisteminde anketin seçenekleri kadar CheckBox kontrolünü dinamik olarak web formunun üzerine yerleştirebilmemiz gerekir. Eğer bu imkanımız olmasaydı Web formları çok esnek bir programlama modeli sunmazdı. Neyse ki Microsoft tasarımcıları herşeyi düşünmüş... :)

Dinamik kontrol oluşturmaya geçmeden önce nasıl bir form tasarımı yapmaya çalıştığımıza bakalım. Aşağıdaki formdan da gördüğünüz üzere 8X8'lik bir dama tahtasının her bir karesi aslında bir Button kontrolünden ibarettir. Tasarım aşamasında 64 tane Button kontrolünü form üzerine yerleştirip herbirni tek tek düzenlemek yerine bir döngü vasıtası ile istediğimiz sayıda Button kontrolünü oluşturup Form elemanına ekleyeceğiz.



ToolBox penceresinde görüdüğünüz bütün kontrolleri temsil eden sınıflar System.Windows.Forms isim alanında bulunan Control isimli sınıftan türetilmiştir. Bazı kontroller ise yapısında değişik kontrolleri barındıracak şekilde tasarlanmıştır. Örneğin Form penceresi üzerene eklenen kontroller bu duruma bir örnektir. Kontrolleri gruplamak için kullanılan GrouopBox ta bu şekildedir. Bu özel kontrollere yeni bir kontrol eklemek için bu Control türünden olan Controls isimli koleksiyon kullanılmaktadır. Örneğin bir form üzerine yeni bir Button kontrolü eklemek için aşağıdaki deyimleri yazmalıyız.


Button tb = new Button();
Form1.Controls.Add(button)

Yukarıdaki deyimleri bir döngü içinde yapıp oluşturduğumuz Button kontrollerinin ilgili özelliklerini değiştirdikten sonra dama tahtasını rahatlıkla oluşturabiliriz.

Şimdi bu yazının en altında bulunan linki kullanarak projeyi bilgisayarınıza yükleyerek projeyi açın. Form1 sınıfının içinde bulunan aşağıdaki TahatCiz() isimli metodu inceleyerek kontrollerin dinamik olarak nasıl yaratıldıklarını inceleyin.


private void TahtaCiz(int Boyut1,int Boyut2, int En, int Boy)
{
    int satir =0;
    int sutun =0;

    Button tb = new Button();

    for(int i=0; i < Boyut1*Boyut2; i++)
    {


        if(i % Boyut2 == 0)
        {
            satir++;
            sutun = 0;
        }

        tb = new Button();
        tb.Name = "tb" + i.ToString();
        tb.TabIndex = i;
        tb.Text = i.ToString();
        tb.Size = new System.Drawing.Size(En,Boy);

        Point p = new System.Drawing.Point(tb.Size.Width + (sutun-1)*tb.Width,tb.Size.Height + (satir-2)*tb.Height);

        tb.Location = p;
        tb.FlatStyle = FlatStyle.Standard;
        tb.Click += new System.EventHandler(this.button1_Click);

        Butonlar.Add(tb);
        this.Controls.Add(tb);
        sutun++;
    }

         this.ClientSize = new Size(tb.Width*Boyut2 ,tb.Height*Boyut1);
        satir = 0;
        sutun = 0;
        Butonlar.TrimToSize();
        RenkAyarla();
}

TahtaCiz() isimli metodu biraz inceleyelim. Bu metot kendisine gönderilen bilgiler ışığında form üzerine dinamik bir dama tahtası çizmektedir. Ayrıca işe yarar bir kaç işlem daha yapmaktadır. Bu metoda gönderilen Boyut1 ve Boyut2 değişkenleri dama tahtasının boyutlarını belirtmektedir. En ve Boy parametreleri ise tahtadaki her bir karenin enini ve boyunu belirtmektedir. Bu bilgileri parametre olarak almamız istediğimiz boyutta dama tahtasını çizebileceğimiz anlamına gelmektedir. Zaten form üzerine konulan bir menü yardımıyla dama tahtasının boyutu ve karelerin en ve boyu istenildiği gibi değiştirilmektedir. Bu metot sadece butonların form üzerine yerleştirilmesinden sorumludur. RenkAyarla() isimli diğer bir metot ise yerleştirilen bu butonların bir algoritmaya göre renklerini ayarlamayı sağlamaktadır. Bu metot içinde oluşturulan buton kontrollerine başka metotlar içinde erişebilmek için oluşturulan her kontrol global düzeyde tanımlanan Butonlar isimli bir Arraylist koleksiyonuna eklenmektedir. Bu metottaki diğer önemli bir satır ise oluşturulan dama tahtasınının boyutlarına göre form nesnesinin yeniden şekillendirilmesidir. Bu işlem

this.ClientSize = new Size(tb.Width*Boyut2 ,tb.Height*Boyut1);

satırıyla yapılmaktadır.

Not: Her bir Button kontrolünün yanyana ve alt alta nasıl yerleştirildiğini daha iyi anlamak için size tavsiyem kağıt üzerine bir dama tahtası çizip her bir karenin konumuna ilişkin matematiksel bir ifade bulun. Böylece herşey daha açık olacaktır.

Aşağıdaki satırda her bir buton kontrolünün Text özelliği döngü değişkeni olan i'ye atanmaktadır.

tb.Text = i.ToString();

Dinamik kontrolleri oluşturma ile ilgili diğer bir önemli nokta da kontrollere ilişkin olayların nasıl çağrılacağıdır. Dikkat ederseniz yukarıdaki metotta oluşturulan bütün kontrollerin Click olayına EventHandler temsilcisi yardımıyla button1_Click() metodu iliştirilmiştir. Oluşturulan butonlardan herhangi birine tıkladığınızda bu metot işletilecektir. Peki hani butonun tıklandığını nasıl anlayacağız. Bunun için button1_Click() metodunun bildirimine bakalım.


private void button1_Click(object sender, System.EventArgs e)
{
    Button b = (Button)sender;

    MessageBox.Show(b.Text);
}

Yukarıdaki metodun bir parametresi olan sender değişkeni bu metodun hangi button'un tıklanması sonucu işletildiğini tutmaktadır. Bize bu imkanı sağlayan elbetteki EventHandler temsilcisidir(delegate).

Dönüşüm operatörü kullanılarak sender nesnesi Button nesnesine dönüştürülümektedir. (Bu işleme unboxing denildiğini de hatırlatmak isterim)

Bu durumda, örneğin üzerinde 39 yazan Button'a tıkladığınızda gösterilen mesaj kutusuna gibi 39 yazacaktır.

Aşağıdaki ekran görüntüsündeki dama tahtasının biçimi uygulamadaki Ayarlar menüsündeki Renk sekmesi tıklanarak oluşturulabilir.



Not: Dama tahtası biçiminde bir form oluşması için Renk Seçimi penceresindeki Gradyan Katsayısı ortalanmalıdır. Renk ayarlama işleminin nasıl yapıldığı bu yazı kapsamında olmadığı için detaylarını anlatmayacağım. RenkAyarla() isimli metodu incelemenizi tavsiye ediyorum.

Web formları ile dinamik kontrol oluşturmak yukarıda anlattıklarımdan farklı değil. Yeni bir ASP.NET uygulaması açarak aşağıdaki gibi bir form tasarlayın.
Dinamik olarak oluşturacağımız kontrolleri Page sınıfına akleyebileceğimiz gibi PlaceHolder kontrolünü de kullanabiliriz. Ben bu iş için PlaceHolder kontrolünü tercih ettim.



"Oluştur" isimli butonun Click olayına ilişkin metodunu aşağıdaki gibi değiştirip sonucu inceleyelim.

private void Button1_Click(object sender, System.EventArgs e)
{
    int Adet = Convert.ToInt32(TextBox1.Text);

    for(int i=0; i     {
        TextBox yeni = new TextBox();
        yeni.ID = "Text" + i.ToString();
        yeni.Text = "TextBox" + i.ToString();

        PlaceHolder1.Controls.Add(yeni);
        PlaceHolder1.Controls.Add(new LiteralControl("
"));
    }
}

Projeyi derleyip çalıştırın ve TextBox kutusuna bir tamsayı girip "Oluştur" butonuna tıklayın. İşlermleri başarı ile yaptıysanız aşağıdaki gibi "PlaceHolder" kontrolü içinde 4 adet TextBox kontrolü dinamik olarak yerleştirilecektir.



Not : Sunucu kontrolü olmayan
etiketinin LiteralControl olarak tanımlandığına dikkat edin.

Dinamik kontrolleri oluşturmayı öğrendiğinize göre artık web tabanlı bir mayın tarlası oyunu yapmanın zamanı geldi sanırım :) Biraz çaba ile bu oyunu rahatlıkla yapabileceğinizi düşünüyorum.

Projeyi indirmek için tıklayın.


Projedeki kaynak kodlarla ilgili herhangi bir yerde takılırsanız bana sorabilirsiniz.

Makale:
.NET'te Dinamik Kontrol Oluşturma C#, Visual C# ve .NET Sefer Algan
  • Yazılan Yorumlar
  • Yorum Yaz
MAY
3
2010
Merhaba; Kodlar görünmüyor yenileyebilirmisiniz? Proje indirme linkide kırık bilginize
ŞUB
22
2010
Hocam Makale cok faydalı olmuş teşekkürler. buna ek olarak birşey soracağım bu butonları oluştururken ben onlara klavyeden kısayol tuşlarıda atamak istiyorum. melela Alt +1 ,Alt+2 .. Alt+9 a kadar ve formda bu tuşlara basıldığında o butonun eventi gerçekleşecek. bunu nasıl yapabilirim. Teşekkürler
MAY
28
2006
Yazan kardeşimin eline koluna sağlık.Çok güzel anlatmış.
HAZ
25
2003
özellikle makalenin konusu çok güzel. teşekkürler.
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor