1

新しく作成されたEventHandlerを使用して変数を送信するにはどうすればよいですか?私が持っているコードは次のようなものです:

for (int i = 0; i < 5; i++)
{   
    Button buttonX = new Button();
    buttonX.Location = new Point(0, 0 + offset);
    buttonX.Size = new Size(310, 48);
    buttonX.Click += new EventHandler(buttonClick);
}

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

どうすればそれを次のようにすることができますか

buttonX.Click += new EventHandler(buttonClick , i);

private void buttonClick(object sender, EventArgs e, int i)
{
    MessageBox.Show(i.toString());
}
4

4 に答える 4

8

閉鎖は壮大です。ラムダ表記を使用できます。

buttonX.Click += (sender, e) => buttonClick(sender, e, i);

または匿名の代理人表記:

buttonX.Click += delegate (object sender, EventArgs e) { buttonClick(sender, e, i); };

ただし、ループ変数をキャプチャすると問題が発生します

代わりに、

for (int i = 0; i < 5; i++)
{   
    Button buttonX = new Button();
    buttonX.Location = new Point(0, 0 + offset);
    buttonX.Size = new Size(310, 48);
    var i_copy = i;
    buttonX.Click += (sender, e) => buttonClick(sender, e, i_copy);
}
于 2012-04-19T23:06:04.917 に答える
2

シナリオを考えると、Tagプロパティを利用するだけです。Clickソリューションとイベントを混同しないでください。iイベントに毎回「合格」する必要はありません。常に同じなので、コントロールにタグを付けるだけです。そうすれば、閉鎖について心配する必要はありません。

コードを次のように変更します。

for (int i = 0; i < 5; i++)
{   
    Button buttonX = new Button();
    buttonX.Location = new Point(0, 0 + offset);
    buttonX.Size = new Size(310, 48);
    buttonX.Click += new EventHandler(buttonClick);
    buttonX.Tag = i;
}

private void buttonClick(object sender, EventArgs e)
{
    MessageBox.Show(((Button)sender).Tag.ToString());
}
于 2012-04-19T23:07:43.307 に答える
1

それはできませんが、できることは中間ラムダを使用することです。

for (int i = 0; i < 5; i++)
{
    int j = i; // Need to do this to fix closure issue

    Button buttonX = new Button();
    buttonX.Location = new Point(0, 0 + offset);
    buttonX.Size = new Size(310, 48);
    buttonX.Click += (sender, e) => {
        buttonClick(sender, e, j);
    };
}


private void buttonClick(object sender, EventArgs e, int i)
{
    MessageBox.Show(i.toString());
}
于 2012-04-19T23:07:30.050 に答える
1

必要な追加のデータポイントを運ぶEventArgsから派生したクラスを作成します。

http://msdn.microsoft.com/en-us/library/system.eventargs.aspx

したがって、EventArgsを使用する代わりに、発生しているイベントのEventArgsを作成します。

public class ButtonClickedEventArgs : EventArgs
{
    public int EventInteger { get; private set; }

    public ButtonClickedEventArgs(int i)
    {
        EventInteger = i;
    }
}

次に、イベントを発生させるときに、ButtonClickedEventArgsクラスを作成し、それをEventHandlerで渡します。

于 2012-04-19T23:09:20.533 に答える