Как работать с делегатами и обработчиком событий для управления пользователем - PullRequest
8 голосов
/ 27 мая 2010

Я создал пользовательский элемент управления, содержащий кнопку. Я использую этот элемент управления на моей winform, которая будет загружена во время выполнения после извлечения данных из базы данных.

Теперь мне нужно удалить строку из таблицы данных по событию Click этой кнопки.

Проблема в том, как мне запечатлеть это событие в моей форме. В настоящее время он входит в определение события btn click этого пользовательского элемента управления.

Ответы [ 3 ]

21 голосов
/ 27 мая 2010

Вы можете создать собственное событие делегата, выполнив следующие действия в своем пользовательском элементе управления:

public event UserControlClickHandler InnerButtonClick;
public delegate void UserControlClickHandler (object sender, EventArgs e);

Вы вызываете событие из вашего обработчика, используя следующее:

protected void YourButton_Click(object sender, EventArgs e)
{
   if (this.InnerButtonClick != null)
   {
      this.InnerButtonClick(sender, e);
   }
}

Затем вы можете подключиться к событию, используя

UserControl.InnerButtonClick+= // Etc.
6 голосов
/ 12 апреля 2012

Нет необходимости объявлять нового делегата. В вашем пользовательском управлении:

public class MyControl : UserControl
{
  public event EventHandler InnerButtonClick;
  public MyControl()
  {
    InitializeComponent();
    innerButton.Click += new EventHandler(innerButton_Click);
  }
  private void innerButton_Click(object sender, EventArgs e)
  {
    if (InnerButtonClick != null)
    {
      InnerButtonClick(this, e); // or possibly InnerButtonClick(innerButton, e); depending on what you want the sender to be
    }
  }
}
0 голосов
/ 28 августа 2018

Просто модернизирую ответ ChéDon , вот как вы можете сделать это в 2018 году:

public class MyControl : UserControl
{
  public event EventHandler InnerButtonClick;

  public MyControl()
  {
    InitializeComponent();
    innerButton.Click += innerButton_Click;
  }

  private void innerButton_Click(object sender, EventArgs e)
  {
      InnerButtonClick?.Invoke(this, e);
      //or
      InnerButtonClick?.Invoke(innerButton, e); 
      //depending on what you want the sender to be
  }
}
...