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;
        }

Mini metod örneği

İstek üzerine basit bir konu ile merhaba. En iyi yazılımcı, az kodla çok şey yapandır. Bu sözden yola çıkarak metotların kod yazarken işimizi kolaylaştırdığı aşikar.

Aynı kodu birden fazla yerde kullanmak isteyebiliriz. Bunun iki yolu vardır biri yüzyılın teknolojisi olan copy-paste diğer ise metod gibi yapılar. Birinci yolu tabi ki kimse tavsiye etmez, çünkü ileride copy-paste yaptığımız kodun bir yerine değiştirmeye kalktığımızda hepsini tek tek değiştirmemiz gerekecek. İşte ikinci yol olarak metodlara burada göre düşüyor.

Yapıyı ve nasıl çalıştığını anlamak için basit iki sayıyı toplayıp KDV’sini hesaplayan mini metod örneği yapalım. Resimdeki gibi forma 2 textbox, label, buton atın. Ardında kod kısmına geçin;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 private static int hesapla(int gelen)
{
int yuzdesi = gelen + (gelen * 18 / 100);
return yuzdesi;
}

private void button1_Click(object sender, EventArgs e)
{
int sayi1 = Convert.ToInt32(textBox1.Text);
int sayi2 = Convert.ToInt32(textBox2.Text);

int toplam = sayi1 + sayi2;

int sonuc = hesapla(toplam);
label1.Text =Convert.ToString(sonuc);

}

Toplama işlemini metodsuz kullanmadan yaptık. Çıkan sonucu göstermeden %18 hesaplayan geriye değer döndüren metoda gönderdik. Adım adım anlatırsak;

  • Aynı sınıf içinde olduğundan dolayı private kullandık metodumuz ayrı sınıf içinde tanımlasaydık  hesaplama yapmak için public kullanmamız gerekirdi.
  • Metodumuzun ismi hesapla olarak tanımladık gönderilen değer int olacağı için int tipinde gelen değişken ile metodumuzu oluşturduk.
  • Geriye değer döndüren metod için return ile metod da yapılan işlemin sonucunu gönderdik.
  • Textbox lardaki değerleri toplayıp çıkan değeri metoda gönderdik, metod da bize yüzdesini hesaplayarak geriye gönderdi. İşlemi label a yazdırdık.