9

パスワードフォーム内でプログラムでボタンをクリックするために、C#.NetでWinFormsプログラムを作成しました。

Form1読み込みForm2、ダイアログ ボックスとして表示します。

DialogResult が DialogResult.OK 以外の場合、アプリケーションは終了します。

これまでのところ、次のようにコーディングされたボタン クリック イベントがあります。

 if (txtpass.Text == "")
            {
                MessageBox.Show("You need to enter a password", "Password", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                txtpass.Focus();
            }
            else
            {
                if (txtpass.Text == "1234")
                {
                    radButton1.DialogResult = DialogResult.OK;
                    radButton1.PerformClick();
                }
                else
                {
                    MessageBox.Show("Password Incorrect", "Password", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    txtpass.Text = "";
                    txtpass.Focus();
                }
            }

を使用radButton1.PerformClick();していますが、プログラムを実行すると次のメッセージが表示されます。

An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll

この例外がスローされる原因がわかりません。

4

5 に答える 5

7

編集推測ではありません。ボタンにそれ自体からクリックするように指示すると、間違いなく無限ループが発生します。これにより、メソッドが何度も呼び出され、スタックがいっぱいになり、オーバーフローが発生します。

私の推測では、呼び出しPerformClick()により、投稿した現在のメソッドが再度呼び出され、無限呼び出しループが発生し、StackOverflowException.

これを防ぐには、次のようにコードのどこかでロジックを修正する必要があります。

if (txtpass.Text == "1234")

に評価されfalse、クリック メソッドが何度も呼び出されることはありません。txtpass.Text = ""もう一度クリックする直前に設定することで、おそらくこれを実現できます。

于 2010-02-16T09:52:29.777 に答える
3

通常、実行しようとしているイベントを手動で呼び出します。

たとえば、メソッドがある場合

button1_Click(object sender, ButtonEventArgs e)
{
}

次に、コードで次のように呼び出します。

button1_Click(this, new ButtonEventArgs());

ただし、何をしようとしているのかが明確ではないため、コードでいくつかのロジックを説明する必要があると思います。おそらくあなたがやっているからでしょう

PerformClick() -> PerformClick() -> PerformClick() 「1234」テキストは呼び出し間で変更されないためです。

于 2010-02-16T09:54:28.413 に答える
1

内部からイベント ハンドラーを再度呼び出すには、次のコードを使用できます。

if (txtpass.Text)
{
    case "1234":
        radButton1.DialogResult = DialogResult.OK;

        txtpass.Text = "12345";

        radButton1.PerformClick();

        break;

    default:
        case "12345":
        break;

}
于 2010-02-16T09:54:11.130 に答える
1

PerformClick()ボタンのクリックイベントの内側ですか?もしそうなら、それはあなたが間違っているところです。なぜなら、アプリケーションを無限ループに投げ込んでいるからです。

ユーザー クリック ボタン、
.NET 実行 Click() ハンドラー、
ボタン クリックPerformClick()
.NET 実行 Click() ハンドラー、
ボタン クリックPerformClick()
.NET 実行 Click() ハンドラー、
ボタン クリックPerformClick()

だけでなく、form1間違いなく電話をかけShowDialog()ていますか?form2Show()

の代わりにradButton1.DialogResult、設定してみてくださいthis.DialogResult == DialogResult.OK

ボタンのプロパティは、 がクリックされたときにどれを に割り当てるかをDialogResult.NET に指示します。DialogResultFormButton

于 2010-02-16T09:55:08.053 に答える
0

スタック オーバーフローは通常、メソッドが無期限に自分自身を呼び出しているために発生します。これは、メソッドが呼び出されるたびに、スタックがなくなるまでエントリがスタックに追加されるためです。

再帰を停止するには、行を削除しますradButton1.PerformClick();

于 2017-06-19T07:10:24.853 に答える