1

ループがforあり、毎回同じメソッドを呼び出します。前の方程式が何であったかを知る方法を見つける必要があります。増分の値を使用せずにこれを見つける必要があります。例えば:

for (int i = 0; i < 101; i++) { 
    checkBox[i].Click += new System.EventHandler(checkBoxMethod); }

checkBoxMethodたとえば、この場合、何らかの方法で前の関数を取得する必要があります。

checkBox[50].Click
4

3 に答える 3

1

for ループ内で、各チェックボックスのタグも設定します。ここでは、Windows フォームを使用していると想定しています。したがって、変更された for ループは次のようになります。

for (int i = 0; i < 101; i++) {
    checkBox[i].Click += new System.EventHandler(checkBoxMethod);
    checkBox[i].Tag = i;
}

次に、イベント ハンドラーで、sender 変数を次のようにチェックボックスにキャストできます。

void checkBoxMethod (object sender, EventArgs args)
{
    CheckBox box = (CheckBox)sender;
    int number = (int)box.Tag;
}

そのチェックボックスのイベント ハンドラを作成した時点での「i」は、変数「number」で取得され、必要に応じて使用できます。

于 2012-05-27T06:12:58.267 に答える
0

ループを使用する代わりに、for再帰を使用して現在のカウントを関数に渡します。

void checkBoxMethod (object sender, EventArgs args)
{
    CheckBox box = (CheckBox)sender;
    int number = (int)box.Tag;
    myRecursiveMethod(number);
}

private void myRecursiveMethod(int count)
{
    //do whatever stuff I need to do

    if (!timeToExitTheMethod)
        myRecursiveMethod(count++);
}

あなたはループで何をしているのか正確に何の説明もforしていませんし、あなたの質問はあまり意味がありません (つまり、あなたがほのめかしているチェックボックスは何ですか?)。例。再帰メソッドの終了ポイントをコーディングする必要があることに注意してください (そうしないと、スタック オーバーフローが発生するまで呼び出されます)。

関数が呼び出された回数をカウントするだけの場合は、次のようにします。

public class MyClass
{
    private int _myCounter = 0;

    void checkBoxMethod (object sender, EventArgs args)
    {
        CheckBox box = (CheckBox)sender;

        //do whatever you need to do

        _myCounter++;
    }

}

要件がより具体的である場合は、より具体的な提案を行うことができます。

于 2012-05-27T06:33:15.330 に答える
0

ラムダエクスパーションを使用して、必要な情報をハンドラーに渡すことができます。

    for (int i = 0; i < n; i++) {
        int number = i;
        buttons[i].Click += (sender, args) => OnButtonClick(sender, args, number);
    }
...
    private void OnButtonClick(object sender, RoutedEventArgs e, int number) {
        MessageBox.Show(number.ToString(CultureInfo.InvariantCulture));
    }
于 2012-05-27T08:32:07.003 に答える