Как работать с делегатами и обработчиком событий для пользовательского контроля

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

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

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


person Shantanu Gupta    schedule 27.05.2010    source источник


Ответы (3)


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

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.
person djdd87    schedule 27.05.2010
comment
Хороший ник :), Не могли бы вы объяснить немного об этом. Я мало знаю о делегатах, событиях и интерфейсах. Как это работает. Как он распознает, что кнопка была нажата? - person Shantanu Gupta; 27.05.2010
comment
По сути, делегат просто указывает на указанные функции. Делегаты являются многоадресными, что означает, что они могут одновременно указывать на несколько методов. т.е. вызов делегата один раз приведет к срабатыванию всех присоединенных методов. Нет смысла объяснять интерфейсы, поскольку они не имеют отношения к этому вопросу, но на SO есть много вопросов о них, если вы выполните поиск. - person djdd87; 27.05.2010
comment
Почему я не могу написать публичное событие int funName; что на самом деле принимают события ? - person Shantanu Gupta; 27.05.2010
comment
Вам нужен обработчик. Вы можете просто изменить делегат (который является обработчиком) на открытый делегат void FunName(int i); - person djdd87; 27.05.2010

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

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
    }
  }
}
person ChéDon    schedule 12.04.2012
comment
Разве вам не нужно где-то определение для innerButton? Это недостающий кусок? - person Alex Amato; 09.09.2013
comment
InnerButtonClick определяется этой строкой: public event EventHandler InnerButtonClick; Если вам не нужен специализированный обработчик событий, нет необходимости переопределять базовый. - person ChéDon; 08.11.2013
comment
Это и приведенный выше пример были именно тем, что я хотел. Завершение примера подключения события и демонстрация того, как клиент может подписаться, может помочь. Возможно также добавить извлечение общедоступного свойства в пользовательском элементе управления по сравнению с пользовательским EventArgs, но приведенная выше ситуация является часто используемой. - person beanmf; 06.05.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
  }
}
person M Granja    schedule 28.08.2018