przypisanie funkcji do eventów ponad 100 kontrolek

0

Witam wszystkich serdecznie!

Więc tak, mam klasę, która dziedziczy po PictureBox, wewnątrz napisałem obsługę zdarzeń kliknięcie, czyli wywołanie eventu kiedy klikniemy na egzemplarz klasy.

w klasie głównej mam tablicę dwuwymiarową 10 x 10, czyli ponad 100 elementów i w każdej jest egzmeplarz ww. klasy. Teraz muszę przypisać do eventu każdego egzemplarza klasy funkcję, jednak musiałoby być to 100 różnych funkcji, a mnie wystarczy jedna funkcja, która będzie jedynie wiedziała, który egzemplarz klasy ją wywołał. Da się jakoś zrobić tak, żebym nie musiał tworzyć 100 funkcji, tylko zrobić to dynamicznie?

    public partial class Form1 : Form
    {
        picture[,] tablica;
        public partial class Form1 : Form
        {
            public Form1()
        {
            InitializeComponent();
            tablica = new picture[10,10]; 
            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 10; j++)
                {                    
                    tablica[i, j] = new picture();
                    // tu jakies ustalenie wymiarow i dodanie elementow do formy itp
                }
            
         }

        }
       
    }



    public class picture : PictureBox
    {

        public event EventHandler click;
        public picture()
        {
            MouseClick += klik;
        }
        
        void klik(object sender, EventArgs e)
        {
            this.BackColor = Color.Yellow;
            if (click != null)
                click(this, e);
            
        }
    }

dodanie znacznika <code class="csharp"> - fp

0

Zdarzenie:

 private void DajGlos(object sender, EventArgs args)
{
Console.WriteLine("Daj głos!");
} 

dodajemy dynamicznie do kontrolek:

 
foreach(Button przycisk in listaPrzyciskow)
{
przycisk.Click += new EventHandler(DajGlos);
}

Zmień na potrzeby własnego kodu. Myślę że prosto opisałem.

1

Informację o obiekcie który kliknąłeś znajdziesz w zmiennej sender.
Jeżeli nazwiesz jakoś swoje pictureboxy, to będziesz mógł je zidentyfikować przez:

(sender as PictureBox).Name
0

Ciekawski to akurat to ja umiem zrobić, chodziło mi o to, że jak tych kontrolek masz 100 to potem żeby wiedzieć kliknięcie, w którą wywołało działanie musiałbym tworzyć 100 funkcji, do każdej kontrolki osobną funkcję.

endrique chyba tak zrobię, zapisze do stringa każdej jakąś nazwę a potem to jakoś rozkoduje :) chyba, że ktoś ma inny pomysł? Myślałem też o rozpoznawaniu po współrzędnych położenia na formie, ale to chyba gorsze rozwiązanie.

1

Nazwę pictureBoxa który tworzysz dynamicznie możesz zapisać np w pictureBox.Name ;)

for (int i = 0;i<10;i++)
{
   var picture = new PictureBox();
   picture.Width = 10;
   picture.Height = 10; 
   Point p = new Point(i * 15, j * 15); 
   picture.Location = p;
   picture.BackColor = Color.Azure;
   picture.Name = i; // <- (sender as pictureBox).Name pokaże Ci to co tu wpiszesz.
   picture.Click += picture_Click;
   Controls.Add(picture);
}

a w evencie picture_Click wiesz co wpisać ;)

0
zelus132 napisał(a):
  
    public class picture : PictureBox
    {

        public event EventHandler click;
        public picture()
        {
            MouseClick += klik;
        }
        
        void klik(object sender, EventArgs e)
        {
            this.BackColor = Color.Yellow;
            if (click != null)
                click(this, e);
            
        }
    }

A co ten kod ma właściwie robić? Bo poza tym, że nazewnictwo jest obrzydliwe, to na 90% dałoby się to prościej zrobić.

0
somekind napisał(a):
zelus132 napisał(a):
  
    public class picture : PictureBox
    {

        public event EventHandler click;
        public picture()
        {
            MouseClick += klik;
        }
        
        void klik(object sender, EventArgs e)
        {
            this.BackColor = Color.Yellow;
            if (click != null)
                click(this, e);
            
        }
    }

A co ten kod ma właściwie robić? Bo poza tym, że nazewnictwo jest obrzydliwe, to na 90% dałoby się to prościej zrobić.

to nie jest nawet 1/100 programu, wrzuciłem tylko fragment, z którym mam problem, a tą zmianę kolorów dałem tylko na chwile żeby sprawdzić czy wszystko działa, ale jak widać zapomniałem usunąć
a jak masz hejtować, że Ci się słówka nie podobają, że umiesz lepiej to weź może nic nie pisz

endrique dokładnie tak samo miałem zrobione jak napisałeś, brakowało mi tylko tego (sender as pictureBox) :D wsio działa, do name dałem indeksy tablicy rozdzielone spacją, a potem to odczytałem za pomocą funkcji split i parse

dzięki za pomoc! :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.