Задать вопрос
@dim9044

Как добавить свое событие при нажатии на кнопку?

Добрый день, прочитал урок по добавлении аргументов при событии. Но в примере был вызов события при выполнении программы.
//addAgent.OnAddAgent += AddAgent2;

Не как не могу додуматься как мне вызвать это событие при нажатии на кнопку, попробовал в функции AddAgent1 вызвать AddAgent2, но не происходит выполнение.

Необходимо чтобы при клике срабатывала функция AddAgent2

public class AddAgentEventArgs : EventArgs
        {
            public string AddAgentInfo { get; set; }
        }

public delegate void AddAgentE(object sender, AddAgentEventArgs e);

public class AddAgent
        {
            public event AddAgentE OnAddAgent;

            public void AddAgentMain(string test)
            {
                if (OnAddAgent != null)
                {
                    // Создаём объект аргумента события и помещаем в него текст письма
                    var e = new AddAgentEventArgs { AddAgentInfo = test };
                    OnAddAgent(this, e);
                }
            }
        }

AddAgent addAgent = new AddAgent();

private void newAgent()
        {
            Button ButtonAddAgent = new Button();
            ButtonAddAgent.Text = "Добавить агента";
            ButtonAddAgent.AutoSize = true;
            ButtonAddAgent.Location = new System.Drawing.Point(290, 200);
            
            //addAgent.OnAddAgent += AddAgent2;
            addAgent.AddAgentMain(TextBoxSurName.Text);
            ButtonAddAgent.Click += new System.EventHandler(AddAgent1);
            splitContainer1.Panel2.Controls.Add(ButtonAddAgent);

        }

        private void AddAgent1 (object sender, EventArgs e)
        {
            addAgent.OnAddAgent += AddAgent2;
            MessageBox.Show("test1");
        }

        private void AddAgent2(object sender, AddAgentEventArgs e)
        {
            Console.WriteLine("test2");
            MessageBox.Show(e.AddAgentInfo);
            
        }
  • Вопрос задан
  • 531 просмотр
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@smozhaykin
В AddAgent1 вы не вызвали AddAgent2, вы только подписались на событие OnAddAgent.

Что у вас происходит:

addAgent.AddAgentMain(TextBoxSurName.Text);
ButtonAddAgent.Click += new System.EventHandler(AddAgent1);


Тут вы сначала вызываете событие OnAddAgent и только потом подписываетесь на событие Click кнопки. То есть к моменту, когда ваш хэндлер кнопки сработает, событие OnAddAgent уже было вызвано и так как на него никто не был подписан, ничего не произошло.

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

private void newAgent()
{
    Button ButtonAddAgent = new Button();
    ButtonAddAgent.Text = "Добавить агента";
    ButtonAddAgent.AutoSize = true;
    ButtonAddAgent.Location = new System.Drawing.Point(290, 200);
            
    ButtonAddAgent.Click += new System.EventHandler(AddAgent1);
    addAgent.OnAddAgent += AddAgent2;
    splitContainer1.Panel2.Controls.Add(ButtonAddAgent);
}

private void AddAgent1 (object sender, EventArgs e)
{
    MessageBox.Show("Before firing OnAddAgent event");
    addAgent.AddAgentMain(TextBoxSurName.Text);
}

private void AddAgent2(object sender, AddAgentEventArgs e)
{
    Console.WriteLine("Inside OnAddAgent event handler");
    MessageBox.Show(e.AddAgentInfo);
}


И совет как правильно вызывать ивенты:
public void AddAgentMain(string test)
{
    var handler = OnAddAgent;
    if (handler != null)
    {
        // Создаём объект аргумента события и помещаем в него текст письма
        var e = new AddAgentEventArgs { AddAgentInfo = test };
        handler(this, e);
    }
}


Или используя фичи C#6:

public void AddAgentMain(string test)
{
    // Создаём объект аргумента события и помещаем в него текст письма
    var e = new AddAgentEventArgs { AddAgentInfo = test };
    OnAddAgent?.Invoke(this, e);
}


Более подробно почему стоит вызывать ивенты именно так можно почитать тут.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы