0

イベントを再帰的に呼び出す方法を探しています。私は次のものを持っています

private void btn_choose_Click(object sender, EventArgs e)
{
    // switch statement to take the user input and decide the outcome.
    switch (Convert.ToInt32(nud_cat_chooser.Value))
    {
        case 1:
            if (Convert.ToInt32(lbl_p1_cat_1_value.Text) == Convert.ToInt32(lbl_p2_cat_1_value.Text))
            {
                MessageBox.Show("Stalemate");//message box to inform the user of a statemate.
                playingcards card1 = player1.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards
                playingcards card2 = player2.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards
                assign_Values();
                btn_choose_Click();
            }
        ....
    }
}

膠着状態を整理するために、もう一度 btn_choose_click イベントを呼び出したいと思います。ラベルには、assign メソッドからの値が与えられます。しかし、 btn_choose_click(); の呼び出しの実装に苦労しています。どの引数を渡す必要がありますか? 誰かが私に例を示すことができますか?

ありがとう :)

4

7 に答える 7

5

送信者と e を渡します。

ただし、私があなたなら、単純にハンドラーからロジックを取り出してメソッドに入れます。ハンドラーを明示的に呼び出すことは明らかに悪い習慣です。イベント ハンドラーは、イベントに応答することになっています。ハンドラーにブレーク ポイントを配置する場合は、ハンドル内のイベントに応答してデバッグ中にヒットするだけであり、クラス内の他のメソッドがそれを呼び出したためではありません。例えば:

private void btn_choose_Click(object sender, EventArgs e)
{
    NewMethod();
}
private void NewMethod()
{ 
    switch (Convert.ToInt32(nud_cat_chooser.Value))
    {


        case 1:
            if (Convert.ToInt32(lbl_p1_cat_1_value.Text) == Convert.ToInt32(lbl_p2_cat_1_value.Text))
            {
                MessageBox.Show("Stalemate");//message box to inform the user of a statemate.
                playingcards card1 = player1.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards
                playingcards card2 = player2.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards
                assign_Values();
                NewMethod();


}
于 2013-04-30T13:38:51.437 に答える
3

を呼び出すだけButton.PerformClick()です。ボタンの名前がわかりません。これにより、メソッドが起動されます。

MSDN のButton.PerformClick()メソッドも参照してください。

このメソッドを呼び出して、Click イベントを発生させることができます。

于 2013-04-30T13:36:00.837 に答える
2

あなたは再帰の地に足を踏み入れようとしています。十分に注意してください!
メソッドを直接呼び出さないでください。これは悪い設計です。別の関数を作成し、これが再帰関数であることを明らかにします。

private void btn_choose_Click(object sender, EventArgs e)
{
    int action = Convert.ToInt32(nud_cat_chooser.Value);
    this.DequeuePlayer(action); 
}

/// <summary>
/// Recursivly called until there is no more cards
/// </summary>
private void DequeuePlayer(int action)
{
    // switch statement to take the user input and decide the outcome.
    switch (action)
    {
        case 1:
            if (Convert.ToInt32(lbl_p1_cat_1_value.Text) == Convert.ToInt32(lbl_p2_cat_1_value.Text))
            {
                MessageBox.Show("Stalemate");//message box to inform the user of a statemate.
                playingcards card1 = player1.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards
                playingcards card2 = player2.Dequeue();//creates tempoary instance of the abstract class playign cards to store the cards
                assign_Values();
                this.DequeuePlayer(action);
            }
        ....
    }
  • 関数を呼び出す前に、UI からデータを抽出します。ロジックのレイヤーを分離する
  • 人里離れた場所で MessageBox.Show を起動しないでください
  • テキスト ボックスの Text プロパティの値をテストします。ユーザーはその中に何でも入れることができます。
于 2013-04-30T13:41:50.230 に答える
1

この場合、次のように呼び出すことができます

btn_choose_Click(this, new EventArgs());

ただし、非常に注意してください。送信者は、どのボタンがイベントを呼び出しているかを識別するために使用されます...これに違反しているため、イベント内の送信者と eventargs パラメーターに依存しないように言及する適切なドキュメントを作成する必要があります。

また、新しいメソッドを作成し、ループを使用して呼び出すことも考えられます...その方が読みやすく、信頼性が高くなります..

于 2013-04-30T13:36:48.863 に答える
0

単純に使用します:

btn_choose_Click(null, null);

メソッドで送信者パラメーターに依存していない限り。コードから関数を抽出して、onClick イベントで呼び出すこともできます。

于 2013-04-30T13:36:19.110 に答える