プログラムによるボタンのクリックは、「System.StackOverflowException」例外がスローされます
-
20-09-2019 - |
質問
私は、パスワードのフォーム内で、プログラムのボタンをクリックしてC#.NETでのWinFormsプログラムを書かれている。
Form1
負荷とダイアログボックスとしてForm2
を示している。
アプリケーションが終了します。
これまでのところ、私は次のようにコード化されたボタンのクリックイベントを、持っています
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();
を削除するには、