Передача большего количества объектов с помощью обработчика событий - PullRequest
1 голос
/ 27 июня 2019

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

Итак, вопрос в том, есть ли способ передать как отправителю (кнопка, которая была нажата), так и прадеду (пользовательский элемент управления, которому принадлежит кнопка отправителя)? Я имею в виду, что это работает, но теперь мне нужно узнать, сколько «поколений» мне нужно, чтобы подняться.

Спасибо, что читаете меня.

1 Ответ

3 голосов
/ 28 июня 2019

Вы можете ввести свой собственный тип EventArgs

public class CustomEventArgs : EventArgs
    {
        public GlobalDebugMonitorControl Control { get; set; }

        public CustomEventArgs(GlobalDebugMonitorControl control) 
        {
            this.Control = control;
        }
    }

и затем изменить eventHandler, чтобы использовать его:

public event EventHandler<CustomEventArgs> ButtonClick;

, чтобы код вызова был:

this.ButtonClick(sender, new CustomEventArgs(this));

и, конечно, организатор события:

protected void UserControl_ButtonClick(object sender, CustomEventArgs e)
        {

            Button tempButton = (Button)sender;
            GlobalDebugMonitorControl tempParentControl = e.Control;

        }
...