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

Listboxlar arası sürükle bırak

Basit bir uygulama ile merhaba. Bu uygulama 2 adet listbox arasında mouse yardımı ile karakter taşımamızı sağlamakta. Öncelikle forma iki adet listbox ekleyelim. Listboxların Properties ‘dan Behavior kategorisi altında bulunan AllowDrop özelliğini true yapın.

Bunları yaptıktan sonra kodlamaya dalabiliriz. Koda dalmadan önce dikkatinizi çekecek olan listbox olayları olmalı. İlk olarak listBox1’in(karakter taşınacak olan listbox ) Events yani olaylarına gelerek MouseDown‘a çift tıklayın. Kodlamadaki gibi devam edin… Ardından Listbox2’nin(karakterin geleceği yer) DragEnter ve DragDrop olaylarına çift tıklayarak alttaki kodlamaları yapın.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  private void listBox1_MouseDown(object sender, MouseEventArgs e)
        {
            listBox1.DoDragDrop(listBox1.SelectedItem, DragDropEffects.Move);
        }

        private void listBox2_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }

        private void listBox2_DragDrop(object sender, DragEventArgs e)
        {
            listBox2.Items.Add(e.Data.GetData(DataFormats.StringFormat));
            listBox1.Items.Remove(e.Data.GetData(DataFormats.StringFormat));
        }

Kaynak : Cemal Can AKGÜL (Bilge Adam Yazılım Eğitmeni)