注册方法的方法在引发事件时调用

2024-05-04

我有一个包含 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);
    }
}

该方法将EventHandlerdelegate 指向,看起来像这样:

private void MyHandler(object sender, EventArgs e)
{
    // this is called when one of the PictureBox controls is clicked
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

注册方法的方法在引发事件时调用 的相关文章

随机推荐