I have a Panel which contains 20 PictureBox controls. If a user clicks on any of the controls, I want a method within the Panel to be called.
How do I do this?
public class MyPanel : Panel
{
public MyPanel()
{
for(int i = 0; i < 20; i++)
{
Controls.Add(new PictureBox());
}
}
// DOESN'T WORK.
// function to register functions to be called if the pictureboxes are clicked.
public void RegisterFunction( <function pointer> func )
{
foreach ( Control c in Controls )
{
c.Click += new EventHandler( func );
}
}
}
How do I implement RegisterFunction()?
Also, if there are cool C# features that can make the code more elegant, please share.
A "function pointer" is represented by a delegate type in C#. The Click event expects an delegate of type EventHandler. So you can simply pass an EventHandler to the RegisterFunction method and register it for each Click event:
public void RegisterFunction(EventHandler func)
{
foreach (Control c in Controls)
{
c.Click += func;
}
}
Usage:
public MyPanel()
{
for (int i = 0; i < 20; i++)
{
Controls.Add(new PictureBox());
}
RegisterFunction(MyHandler);
}
Note that this adds the EventHandler delegate to every control, not just the PictureBox controls (if there are any other). A better way is probably to add the event handlers the time when you create the PictureBox controls:
public MyPanel()
{
for (int i = 0; i < 20; i++)
{
PictureBox p = new PictureBox();
p.Click += MyHandler;
Controls.Add(p);
}
}
The method that the EventHandler delegate points to, looks like this:
private void MyHandler(object sender, EventArgs e)
{
// this is called when one of the PictureBox controls is clicked
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With