Привязка метода к событию в C # с оператором + = - PullRequest
1 голос
/ 28 апреля 2011

Я делал форму Windows и пытался вручную привязать метод к событию click myButton, например:

    public Form1()
    {
        InitializeComponent();
        myButton.Click = new EventHandler(ShowMessage("You clicked my button!"));
    }

    private void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }

Как некоторые из вас могут догадаться, компилятор не сделалкак это.Я не был уверен, почему, потому что я привык делать что-то в Javascript следующим образом:

document.getElementById("myButton").onclick = function(){showMessage("You clicked my button")};
function showMessage(message) {
  alert(message);
}

Я запутался в этом и в итоге сделал что-то действительно уродливое с использованием глобальной переменной вроде этой:

    string message = "";
    public Form1()
    {
        InitializeComponent();
        message = "You clicked my button!";
        myButton.Click += ShowMessage; 
    }

    private void ShowMessage(object sender, EventArgs e)
    {
        MessageBox.Show(message);
    }

Вот два моих вопроса: во-первых, есть ли более чистый способ сделать это?Во-вторых, почему методы событий должны назначаться с +=, а не просто =?

Ответы [ 6 ]

6 голосов
/ 24 января 2014

Можно использовать и лямбду.

myButton.Click += (sender, e) => {
    MessageBox.Show("You clicked my button!");
};
6 голосов
/ 28 апреля 2011

Обработчики событий должны быть добавлены к событиям с +=, потому что у события может быть несколько других делегатов, неизвестных вашему коду.Чистое назначение подразумевает возможность удаления других связанных делегатов, что вы не должны иметь права делать в качестве клиента события.

Кроме того, вы, вероятно, захотите воспользоваться анонимными делегатами для выполнения любой формы аргументасвязывание.Например:

myButton.Click += delegate(object sender, EventArgs e) {
    MessageBox.Show("You clicked my button!");
};
4 голосов
/ 28 апреля 2011

Вот мои два вопроса: во-первых, это Есть ли более чистый способ сделать это?

да анонимные функции, как в JavaScript (другой синтаксис)

myButton.Click += delegate(object sender, EventArgs e)   
{ 
  MessageBox.Show(message);
};  

почему методы событий должны быть присваивается + =, а не только =?

В противном случае вы можете иметь только 1 обработчик событий вместо нескольких для одного и того же события. + = часто используется в языке программирования для добавления чего-либо. = используется для установки значения переменной.

1 голос
/ 28 апреля 2011

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

private void ShowMessage(object sender, EventArgs e, string message)
{
    MessageBox.Show(message);
}


public Form1()
{
    InitializeComponent();
    myButton.Click += delegate(object sender, EventArgs e)   
    { 
        ShowMessage(sender,e,"You clicked my button!");
    };  
}
1 голос
/ 28 апреля 2011

Вы можете набрать myButton.Click += delegate { showmessage("You clicked my button!"); };

1 голос
/ 28 апреля 2011

Поскольку можно добавить более одного обработчика, как в вашем коде javascript, в onclick будет вызываться только одна функция.

Пример:

myButton.Click += ShowMessage;
myButton.Click += LogToFile;

Обе функции ShowMessage и LogToFile будут вызываться при нажатии кнопки. Это то, что "+" в "+ =" пытается указать. Вы добавляете в обработчик, а не заменяете его.

Что касается упрощения, вы можете использовать анонимные lamdas, чтобы помочь лайку, но учтите, что это затрудняет отсоединение / удаление обработчиков позже (если это важно).

myButton.Click += new EventHandler( (sender,e) => ShowMessage("You clicked my button!") );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...