Я читал похожие вопросы о перегрузке обработчиков событий, используя не обработчики событий, а делегаты или вызывая другие функции из обработчика событий. Но я действительно не понимаю, как я могу связать делегата с пользовательским элементом управления, как я связываю ButtonClick в коде ниже. У меня есть форма с, скажем, 10 пользовательских элементов управления. Каждый пользовательский элемент управления имеет 5 кнопок. Я передаю нажатия клавиш от каждой кнопки каждого пользовательского элемента управления:
Это в cs файле моего пользовательского элемента управления (GlobalDebugMonitorControl.cs)
namespace GlobalDebugMonitor
{
public partial class GlobalDebugMonitorControl : UserControl
{
public GlobalDebugMonitorControl()
{
InitializeComponent();
}
public event EventHandler ButtonClick;
private void MultiControl_Click(object sender, EventArgs e)
{
if (this.ButtonClick != null)
this.ButtonClick(sender, e);//**How Do I put here both sender and this**
}
}
}
Тогда все кнопки в пользовательском control.designer.cs имеют что-то вроде этого:
this.openFileBTN.Click += new System.EventHandler(this.MultiControl_Click);
this.editFilePathBTN.Click += new System.EventHandler(this.MultiControl_Click);
this.delControlBTN.Click += new System.EventHandler(this.MultiControl_Click);
this.addControlBTN.Click += new System.EventHandler(this.MultiControl_Click);
this.editCompanyNameBTN.Click += new System.EventHandler(this.MultiControl_Click);
А потом в моем виде1
namespace GlobalDebugMonitor
{
public partial class Form1 : Form
{
protected void UserControl_ButtonClick(object sender, EventArgs e)
{
Button tempButton = (Button)sender;
GlobalDebugMonitorControl tempParentControl = (GlobalDebugMonitorControl)((tempButton.Parent).Parent).Parent;
}
private void Form1_Load(object sender, EventArgs e)
{
foreach (string item in tempGlobalPaths)
{
GlobalDebugMonitorControl tempGDMcontrol = new GlobalDebugMonitorControl();
tempGDMcontrol.Name = item.Split(',')[0];
tempGDMcontrol.companyNameLBL.Text = item.Split(',')[0];
tempGDMcontrol.globalPathTXT.Text = item.Split(',')[1];
tempGDMcontrol.ButtonClick += new EventHandler(UserControl_ButtonClick);
flowLayoutPanel1.Controls.Add(tempGDMcontrol);
}
}
}
}
Как вы можете видеть, я создаю tempButton отправителем для выполнения некоторых действий, основанных на том, какая кнопка была нажата из 5, и sender.parent.parent (пользовательский элемент управления находится внутри таблицы, которая находится внутри потока, который находится внутри другая панель и т. д.) Наконец я дошел до пользовательского элемента управления, который сообщает мне, на каком из 10 пользовательских элементов управления была нажата его кнопка.
Итак, вопрос в том, есть ли способ передать как отправителю (кнопка, которая была нажата), так и прадеду (пользовательский элемент управления, которому принадлежит кнопка отправителя)? Я имею в виду, что это работает, но теперь мне нужно узнать, сколько «поколений» мне нужно, чтобы подняться.
Спасибо, что читаете меня.