我有一个包含 20 个 PictureBox 控件的面板。如果用户单击任何控件,我希望调用面板中的方法。
我该怎么做呢?
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# 功能可以使代码更加优雅,请分享。
“函数指针”由 C# 中的委托类型表示。这Click
事件需要一个类型的委托EventHandler
。所以你可以简单地传递一个EventHandler
到 RegisterFunction 方法并为每个 Click 事件注册它:
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);
}
请注意,这会添加EventHandler
委托给every控件,而不仅仅是 PictureBox 控件(如果还有其他控件)。更好的方法可能是在创建 PictureBox 控件时添加事件处理程序:
public MyPanel()
{
for (int i = 0; i < 20; i++)
{
PictureBox p = new PictureBox();
p.Click += MyHandler;
Controls.Add(p);
}
}
该方法将EventHandler
delegate 指向,看起来像这样:
private void MyHandler(object sender, EventArgs e)
{
// this is called when one of the PictureBox controls is clicked
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)