我有一个包含20个PictureBox控件的Panel。如果用户点击任何控件,我希望调用Panel中的方法。
我该怎么做?
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 );
}
}
}
如何实施RegisterFunction()
?
此外,如果有很酷的C#功能可以使代码更优雅,请分享。
答案 0 :(得分:7)
“函数指针”由C#中的委托类型表示。 Click
事件需要EventHandler
类型的委托。因此,您只需将EventHandler
传递给RegisterFunction方法,并为每个Click事件注册它:
public void RegisterFunction(EventHandler func)
{
foreach (Control c in Controls)
{
c.Click += func;
}
}
用法:
public MyPanel()
{
for (int i = 0; i < 20; i++)
{
Controls.Add(new PictureBox());
}
RegisterFunction(MyHandler);
}
请注意,这会将EventHandler
委托添加到每个控件,而不仅仅是PictureBox控件(如果还有其他控件)。更好的方法是在创建PictureBox控件时添加事件处理程序:
public MyPanel()
{
for (int i = 0; i < 20; i++)
{
PictureBox p = new PictureBox();
p.Click += MyHandler;
Controls.Add(p);
}
}
EventHandler
委托指向的方法如下所示:
private void MyHandler(object sender, EventArgs e)
{
// this is called when one of the PictureBox controls is clicked
}
答案 1 :(得分:0)
正如dtb所提到的,你绝对应该在创建每个EventHandler
时分配PictureBox
。另外,你可以使用lambda表达式来做到这一点。
public MyPanel()
{
for (int i = 0; i < 20; i++)
{
PictureBox p = new PictureBox();
var pictureBoxIndex = i;
p.Click += (s,e) =>
{
//Your code here can reference pictureBoxIndex if needed.
};
Controls.Add(p);
}
}