Метод для регистрации метода, вызываемого при возникновении события - PullRequest
3 голосов
/ 01 июня 2010

У меня есть панель, которая содержит 20 элементов управления PictureBox. Если пользователь нажимает на любой из элементов управления, я хочу, чтобы метод в 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 #, которые могут сделать код более элегантным, поделитесь.

Ответы [ 2 ]

7 голосов
/ 01 июня 2010

«Указатель на функцию» представлен типом делегата в 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
}
0 голосов
/ 01 июня 2010

Как упоминалось в dtb, вы определенно должны назначить EventHandler при создании каждого PictureBox. Кроме того, вы можете использовать лямбда-выражение для этого.

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...