Dodawanie zdarzeń do kontrolek utworzonych dynamicznie

0

Cześć,

Jestem początkujący w C# i jest to mój pierwszy post na forum. Aktualnie uczę się podstaw programowania i mam do zrobienia projekt, w którym na oknie głównym Form1 chciałbym tworzyć dynamicznie kontrolki. W programie, który zamieściłem poniżej mam już zaimplementowane rysowanie dynamiczne czterech zestawów etykiet. Za pomocą funkcji addlabel_a dodaję na Form1 największą etykietę, następnie na utworzonej etykiecie dodaje dwie mniejsze za pomocą funkcji addlabel_b i addlabel_c. Kolejnym krokiem jest dodanie zdarzeń do kontrolek, i tu pojawia się mój problem. Chciałbym, aby naciśnięcie. na label_a lub na etykiety znajdujące się na label_a: label_b oraz label_c powodowały zmianę lokalizacji etykiety label_a, która zawiera pozostałe etykiety. W kodzie poniżej mam możliwość zmiany pozycji etykiety label_a na obszarze Form1 oraz zmianę pozycji label_b oraz label_c na obszarze label_a. W skrócie, naciśnięcie i przesunięcie którejkolwiek zawszę ma przesuwać cały zestaw:label_a, label_b, label_c. W jaki sposób mogę rozwiązać problem przekazania obiektu label_a do zdarzeń dotyczących label_b oraz label_c? Program w załączniku. Dziękuję z góry za pomoc:)

screenshot-20190322081431.png

        public Form1()
        {
            InitializeComponent();
        }

        private Point firstPoint = new Point();

        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < 4; i++)
            {
                Label a = addlabel_a(i);
                this.Controls.Add(a);

                Label b = addlabel_b(i);
                a.Controls.Add(b);

                Label c = addlabel_c(i);
                a.Controls.Add(c);

                a.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Function_1);
                a.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Function_2);

                b.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Function_1);
                b.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Function_2);

                c.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Function_1);
                c.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Function_2);
            }
        }

        Label addlabel_a(int i)
        {
            Label l = new Label();
            l.Name = "label_a" + i.ToString();
            l.Text = "label_a" + i.ToString();
            l.ForeColor = Color.White;
            l.BackColor = Color.Green;
            l.Font = new Font("Serif", 24, FontStyle.Bold);
            l.Width = 250;
            l.Height = 150;
            l.TextAlign = ContentAlignment.MiddleCenter;
            l.Margin = new Padding(5);

            return l;
        }

        Label addlabel_b(int i)
        {
            Label l = new Label();
            l.Name = "label_b" + i.ToString();
            l.Text = "label_b" + i.ToString();
            l.ForeColor = Color.White;
            l.BackColor = Color.Pink;
            l.Font = new Font("Serif", 24, FontStyle.Bold);
            l.Width = 200;
            l.Height = 40;
            l.TextAlign = ContentAlignment.MiddleCenter;
            l.Margin = new Padding(5);
            l.Location = new Point(40, 20);

            return l;
        }

        Label addlabel_c(int i)
        {
            Label l = new Label();
            l.Name = "label_c" + i.ToString();
            l.Text = "label_c" + i.ToString();
            l.ForeColor = Color.White;
            l.BackColor = Color.Yellow;
            l.Font = new Font("Serif", 24, FontStyle.Bold);
            l.Width = 70;
            l.Height = 70;
            l.TextAlign = ContentAlignment.MiddleCenter;
            l.Margin = new Padding(5);
            l.Location = new Point(20, 20);

            return l;
        }

        private void Function_1(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                firstPoint = Control.MousePosition;
            }
        }

        private void Function_2(object sender, MouseEventArgs e)
        {
            Label l = (Label)sender;

            if (e.Button == MouseButtons.Left)
            {
                Point temp = Control.MousePosition;
                Point res = new Point(firstPoint.X - temp.X, firstPoint.Y - temp.Y);

                l.Location = new Point(l.Location.X - res.X, l.Location.Y - res.Y);

                firstPoint = temp;

                // Odświeżenie formy
                this.Update();
            }
        }
1

https://stackoverflow.com/questions/1531594/c-sharp-dynamically-add-event-handler tutaj masz temat na pokrewny temat. Ja o czymś takim googlowałem.
https://stackoverflow.com/questions/8608311/how-to-add-buttons-dynamically-to-my-form - tutaj masz jak tworzyć dynamicznie buttony.

0

Chyba najprostszym wyjściem by było, aby w twoich funkcjach zamiast tworzyć lokalną zmienną typu Label to zapisywać do jakiegoś pola klasy twoje kontrolki (odwołania do nich) - i wtedy wszystkie metody twojej klasy będą miały do nich dostęp.

Albo skorzystać z odwołania do Controls w twoim senderze w zdarzeniu - który zawiera wszystkie "dzieci" elementu.

0

Dziękuję bardzo za wskazówki:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1