プログラムによるボタンのクリックは、「System.StackOverflowException」例外がスローされます

StackOverflow https://stackoverflow.com/questions/2271883

質問

私は、パスワードのフォーム内で、プログラムのボタンをクリックして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

私はこの例外をスローする原因となっているわからないんです。

役に立ちましたか?

解決

編集ないと思います。自身の中から自分自身をクリックするボタンを告げることはほとんど間違いなく無限ループを引き起こしています。これは、スタックを充填し、それがオーバーフローさせる、方法が何度も呼び出されますになります。

私の推測では、呼び出しPerformClick()は、このように無限コールループを引き起こし、StackOverflowExceptionで、その結果、あなたは再び呼び出されるために掲示現在のメソッドを引き起こしているということです。

これを防ぐために、あなたはそのようどこかにあなたのコード内のロジックを修正する必要があります:

if (txtpass.Text == "1234")

falseし評価し、クリック方法は、何度も呼び出されません。おそらく、あなたはそれが再び自分自身をクリックさせ、右の前にtxtpass.Text = ""を設定することによって、これを達成することができます。

他のヒント

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

例えば。あなたがメソッドを持っている場合は、

button1_Click(object sender, ButtonEventArgs e)
{
}

次に、あなたのコードに次のように呼び出します:

button1_Click(this, new ButtonEventArgs());

私は多分あなたはそれはあなたが何をしようとして明確ではないとして、しかし、あなたのコード内のいくつかのロジックを説明する必要があると思います。あなたがやっているせいか、StackOverflowの

PerformClick() - > PerformClick() - > PerformClick()あなたの "1234" のテキストは、呼び出しの間に変化したことがないので、

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

ユーザーが
、ボタンをクリックします .NETは、クリック()ハンドラ、
を実行します ボタンをクリックするPerformClick()
.NETは、クリック()ハンドラ、
を実行します ボタンをクリックするPerformClick()
.NETは、クリック()ハンドラ、
を実行します ボタンをクリックするPerformClick()

など。

form1は間違いShowDialog()form2を呼び出し、そしてちょうどShow()ていませんか?

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

ボタンをDialogResultプロパティはDialogResultがクリックされたFormに割り当てるButton .NETを伝えます。

次のコードを使用することができます内側から再びイベントハンドラを呼び出すには

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

        txtpass.Text = "12345";

        radButton1.PerformClick();

        break;

    default:
        case "12345":
        break;

}
この方法は、無期限にメソッドが呼び出されるたびので、エントリが左もはやスタックが存在しない点にスタックに追加され、自分自身を呼び出しているので、

スタックオーバーフローが通常起こる。

、再帰を停止ラインradButton1.PerformClick();を削除するには、

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top