All the methods that are called by events require two arguments:
object sender
EventArgs e

The event calls a method using those 2 parameters, so we can’t directly add a custom argument.

If we have this code and we want to display the string ‘s’ in a MessageBox…

1
2
3
4
5
6
7
8
9
10
11
private void Form1_Load (object sender, EventArgs e)
{
string s = "Hello!";
button.Click += new EventHandler(show_msg);  // our string is not included in the call
}

private void show_msg(object sender, EventArgs e, string s)
// this gives an error, because the function is called with only 2 arguments, but it expects 3
{
MessageBox.Show(s);
}


Clearly this will not work because we are limited to those two parameters.

## The Solution

The easiest solution is to use a delegate to call our method.

We get the shortest code using the lambda operator, whose symbol is =>.

• It is recommended for beginners because of its simplicity.
1
2
3
4
5
6
7
8
9
10
private void Form1_Load (object sender, EventArgs e)
{
string s = "Hello!";
button.Click += (sender2, e2) => show_msg(sender2, e2, s);
}

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


Without using the lambda operator, it can be rewritten using a delegate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void Form1_Load (object sender, EventArgs e)
{
string s = "Hello!";

button.Click += delegate(object sender2, EventArgs e2)
{
show_msg(sender2, e2, s);
};
}

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


That’s all :).