Dinamik kontrol oluşturma ve sürükle bırak

Dinamik oluşturulan kontrolü çalışma zamanında kontrol etmek de diyebiliriz. Masaüstü form uygulamalarımızda bazen kullanıcılarımızdan çalışma anında kontrol oluşturmasını isteye bilir, bu oluşturulan dinamik kontrolü sürükle bırak yöntemi ile istediği yere konumlandırmak isteye biliriz. Hata oluşturduğu bu kontrolün özelliklerini(text, name) kullandırabiliriz.

dinamik-kontrol-surukle-birak

Şekildeki gibi bir form ekranı hazırladıktan sonra olayı ele alalım.(Beyaz panel içindeki butonları oluşturmayın!) Burada yapılan işlem şu şekilde cereyan etmekte; sol taraftaki butonu panel içine sürükleyip bırakıyoruz. Bırakıldıktan sonra panel içine yeni bir buton oluşturuluyor. Çalışma anında oluşturulan bu butonu panel içinde istediğimiz yere konumlandırabilir, tıkladığımızda butonun özelliklerini alabiliriz. Mevzumuz bu dostlar…

Kod kısmına geçmeden önce şimdiden söyleyeyim, kod kısmı biraz karışık gözükebilir. Örneği metotları ile birlikte teker teker yazdığınızda mevzunun o kadar zor olmadığını anlayacaksınız. Butonun; MouseDown, MouseLeave, MouseMove özelliklerine gelerek butona sürükle bırak özelliği veriyoruz. Çalışma zamanında oluşturulacak buton için gerekli metotları ekliyoruz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
bool tasimaBasladi;
        int x;
        int y;
        protected void dinamikMetod(object sender, EventArgs e)
        {
            Button dinamikButon = (sender as Button);
            MessageBox.Show("Tıkdığın buton adı " + dinamikButon.Text);

        }
        protected void dinamikBasla(object sender, MouseEventArgs e)
        {
            tasimaBasladi = true;
        }
        protected void dinamikDur(object sender, EventArgs e)
        {
            tasimaBasladi = false;
        }
        protected void dinamikTasi(object sender, MouseEventArgs e)
        {
            Button dinamikButon = (sender as Button);
            if (tasimaBasladi == true && e.Button == MouseButtons.Left)
            {
                dinamikButon.Left += e.X - dinamikButon.Width / 2;
                dinamikButon.Top += e.Y - dinamikButon.Height / 2;
            }

            lblx.Text = Convert.ToString(dinamikButon.Location.X);
            lbly.Text = Convert.ToString(dinamikButon.Location.Y);
        }


        private void btnTasinan_MouseDown(object sender, MouseEventArgs e)
        {
            tasimaBasladi = true;
        }

        private void btnTasinan_MouseLeave(object sender, EventArgs e)
        {
            tasimaBasladi = false;
            int i = 0;
            foreach (Control ktn in panel1.Controls)
            {
                if (ktn is Button)
                {
                    i = i + 1;
                }
            }

            Button btn = new Button();
            btn.Name = i.ToString();

            btn.AutoSize = false;

            btn.Size = new Size(80, 30);
            btn.Text = "Buton " + i.ToString();
            btn.Font = new Font(btn.Font.FontFamily.Name, 8);
            btn.Location = new Point(x, y);
            panel1.Controls.Add(btn);
            btnTasinan.Location = new Point(x: 12, y: 125);
            btn.Click += new EventHandler(dinamikMetod);

            btn.MouseDown += new MouseEventHandler(dinamikBasla);

            btn.MouseLeave += new EventHandler(dinamikDur);

            btn.MouseMove += new MouseEventHandler(dinamikTasi);


        }

        private void btnTasinan_MouseMove(object sender, MouseEventArgs e)
        {
            if (tasimaBasladi == true && e.Button == MouseButtons.Left)
            {
                btnTasinan.Left += e.X - btnTasinan.Width / 2;
                btnTasinan.Top += e.Y - btnTasinan.Height / 2;
            }
            lblx.Text = Convert.ToString(btnTasinan.Location.X);
            lbly.Text = Convert.ToString(btnTasinan.Location.Y);

            x = btnTasinan.Location.X;
            y = btnTasinan.Location.Y;
        }

Dinamik buton oluşturup kontrol etme

Runtime zamanında bazen dinamik buton oluşturmak istemişizdir. Yada kod ile buton oluşturmak…  Buna, kullanıcının ihtiyacına karşı olarak projelerimizde kullanmaktayız.

dinamik-coklu-buton

Örneği anlamak için form ekranıına bir adet label, textbox ve buton resimdeki gibi oluşturup kodlamaya geçebiliriz. Kullanıcıdan alınan buton sayısı doğrultusunda form ekranın büyüklüğüne göre oluşturulan butonları boyutlandıra biliriz.

Boyutlandırmadaki amaç birden fazla buton eklendiği için normal şartlarda yan yana veya alt alta standart boyutta buton oluşturmakta. Hem bunları bir sıraya sokup hemde formun genişliğine ve yüksekliğini referans alarak butonları düzgün bir şekilde göstere biliriz.

 private void button1_Click(object sender, EventArgs e)
        {
            int butonSayisi = Convert.ToInt32(textBox1.Text);
            int sol = 1; //formun sol tarafından atanan değer
            int alt = 50; // formun üst tarafından atanan değer
            int bol; // bolme işlemindeki amaç formun boyutuna göre butonları sıralı bir şekilde görebilmek için
            bol = Convert.ToInt32(Math.Ceiling(Math.Sqrt(butonSayisi)));

            for (int i = 1; i <= butonSayisi; i++)  // girilen buton sayısına göre döngü şartı sağlanana kadar oluşturmakta
            {
                Button btn = new Button();
                btn.Name = i.ToString();

                btn.AutoSize = false;

                btn.Size = new Size(this.Width / bol, this.Height / (bol * 2));
                btn.Text = "Buton " + i.ToString();
                btn.Font = new Font(btn.Font.FontFamily.Name, 18);
                btn.Location = new Point(sol, alt);
                this.Controls.Add(btn);
                sol += btn.Width + 5;

                if (sol + this.Width / bol > this.Width) // bunu yapmasaydık butonlar yan yana dizilir alt satıra geçmedi
                {
                    sol = 1;
                    alt += this.Height / (bol * 2) + 5;
                }

                btn.Click += new EventHandler(dinamikMetod); // dinamik olarak oluşturulan butonu kontrol etmek için her oluşturulan butonun clik olayına atıyoruz.

            }
        }

Kod içinde yeterli açıklama mevcut.  Genel olarak anlatırsak; form içinde butonları düzgün bir şekilde görünebilmesi için girilen buton sayısı değerinin Math.Sqrt ile kare kökünü alıp sonucun doğru bir şekilde çıkması için Math.Ceiling ile yuvarladık.  Bunu yapmamızın nedeni, kullanıcının girdiği buton sayısına göre butonların büyüklüğünü ayarlayabilmek. Bunu yapmasak kullanıcı 100 tane buton istese, buton büyüklüğünü önceden girdiğimiz için butonları çoğu taşacak veya üst üste gelerek kötü bir görüntü elde edeceğiz. Örneği uygulayarak konuyu anlayacağınızı umuyorum.

Dinamik olarak oluşturulan butonu nasıl yakalayabiliriz derseniz üst tarafta oluşturduğumuz butonlar içine atanan clik olayını metod yardımı ile yakalayıp, runtime da oluşturulan butona tıklanıldığında o butona ait isim, vs özelliklerine ulaşabiliriz. Bunun için alttaki kodları örneğimize dahil ederek konuyu öğrenebilirsiniz.

 protected void dinamikMetod(object sender, EventArgs e)
        {
            Button dinamikButon = (sender as Button);
            MessageBox.Show(dinamikButon.Text + " isimli butona tıkladınız");
        }

Burada tıklatılan butonun textini mesaj kutusunda gösterdik.

Aynı şekilde diğer kontrolleri de(label, combobox gibi) oluşturabiliriz.  Bu örnek uygulamayı nerede kullanabiliriz derseniz; adisyon programında işletme sahibinden girilen masa sayısını form ekranına gösterip, herhangi masa hesabını açmak ve kapatmak için kullanabiliriz.