使用 DialogShow() 接收密码输入不起作用
Receiving password input using DialogShow() not working
我正在用 C# 编写一个 WinForm 应用程序。有一个 Form A
在 Button
单击时打开 Form C
。现在,我想在打开 Form C
之前添加一个密码输入屏幕 Form B
。只有输入的密码正确才会打开Form C
,否则显示错误信息。 Form B
只有一个 TextBox
控件和一个 Verify Button
控件。
/*Form A*/
FormB fb;
private void BtnClick(object sender, EventArgs e) {
DialogResult result;
//fb can open once at a time
if(fb == null){
fb = new FormB();
fb.FormClosed += new FormClosedEventHandler(FormB_FormClosed);
//This seems to be not working
result = fb.ShowDialog();
}
else //FormB already open. Do nothing
return;
//Only if password entered is correct, proceed
if(result == DialogResult.Yes){ //result == cancel
//Code to open Form C //Program never reaches here
}
}
//Upon closing FormB, reset it to null
private void FormB_FormClosed(object sender, FormClosedEventArgs e){
if(fb != null)
fb = null;
}
/* Form B */
private const string password = "xxxyyyzzz";
private void BtnPW_Click(object sender, EventArgs e){
bool result = Verify();
if(result){
BtnPW.DialogResult = DialogResult.Yes;
}
else{
MessageBox.Show("Error: Incorrect password");
BtnPW.DialogResult = DialogResult.No;
}
this.Close(); //Added
}
private bool Verify(){
if(TxtBox.Text == password)
return true;
else
return false;
}
有人能告诉我这段代码有什么问题吗?它永远不会到达 Form A
.
中的第二个 if
语句
编辑:即使我输入正确的密码并点击 Form B
上的按钮,Form A
中的 result
也会得到“DialogResult.Cancel”。
如果您调用 Form.Close 方法,则该表单的 DialogResult 属性 将设置为 DialogResult.Cancel,即使您已将其设置为其他内容。要隐藏以模态方式打开的表单,您只需将表单的 DialogResult 属性 设置为除 DialogResult.None.
之外的任何值
说您的代码似乎不是通常用于处理模态对话框的代码。
ShowDialog 正在阻止您的代码,您不会退出此调用,直到被调用的窗体被关闭或隐藏,因此您不需要保留 FormB 的全局变量并处理 FormA 中 FormB 的 FormClosed 事件处理程序。
private void BtnClick(object sender, EventArgs e)
{
using(FormB fb = new FormB())
{
// Here the code returns only when the fb instance is hidden
result = fb.ShowDialog();
if(result == DialogResult.Yes)
{
//open Form C
}
}
}
现在应该去掉FormB代码中对Form.Close的调用,直接设置FormB的DialogResult属性,此时不要尝试改变DialogResult属性的按钮,这将不起作用,您需要再次单击以隐藏表单,而不是直接设置表单的 DialogResult 属性.
private const string password = "xxxyyyzzz";
private void BtnPW_Click(object sender, EventArgs e)
{
if(Verify())
this.DialogResult = DialogResult.Yes;
else
{
MessageBox.Show("Error: Incorrect password");
this.DialogResult = DialogResult.No;
}
}
通过这种方式,表单被隐藏(不是关闭)并且您的代码从 FormA 中的 ShowDialog 调用中退出。在 using 块中,您仍然可以使用 FormB 实例来读取其属性并采用适当的路径。当您的代码从 using 块中退出时,fb 实例将自动关闭并销毁。
我正在用 C# 编写一个 WinForm 应用程序。有一个 Form A
在 Button
单击时打开 Form C
。现在,我想在打开 Form C
之前添加一个密码输入屏幕 Form B
。只有输入的密码正确才会打开Form C
,否则显示错误信息。 Form B
只有一个 TextBox
控件和一个 Verify Button
控件。
/*Form A*/
FormB fb;
private void BtnClick(object sender, EventArgs e) {
DialogResult result;
//fb can open once at a time
if(fb == null){
fb = new FormB();
fb.FormClosed += new FormClosedEventHandler(FormB_FormClosed);
//This seems to be not working
result = fb.ShowDialog();
}
else //FormB already open. Do nothing
return;
//Only if password entered is correct, proceed
if(result == DialogResult.Yes){ //result == cancel
//Code to open Form C //Program never reaches here
}
}
//Upon closing FormB, reset it to null
private void FormB_FormClosed(object sender, FormClosedEventArgs e){
if(fb != null)
fb = null;
}
/* Form B */
private const string password = "xxxyyyzzz";
private void BtnPW_Click(object sender, EventArgs e){
bool result = Verify();
if(result){
BtnPW.DialogResult = DialogResult.Yes;
}
else{
MessageBox.Show("Error: Incorrect password");
BtnPW.DialogResult = DialogResult.No;
}
this.Close(); //Added
}
private bool Verify(){
if(TxtBox.Text == password)
return true;
else
return false;
}
有人能告诉我这段代码有什么问题吗?它永远不会到达 Form A
.
if
语句
编辑:即使我输入正确的密码并点击 Form B
上的按钮,Form A
中的 result
也会得到“DialogResult.Cancel”。
如果您调用 Form.Close 方法,则该表单的 DialogResult 属性 将设置为 DialogResult.Cancel,即使您已将其设置为其他内容。要隐藏以模态方式打开的表单,您只需将表单的 DialogResult 属性 设置为除 DialogResult.None.
之外的任何值说您的代码似乎不是通常用于处理模态对话框的代码。
ShowDialog 正在阻止您的代码,您不会退出此调用,直到被调用的窗体被关闭或隐藏,因此您不需要保留 FormB 的全局变量并处理 FormA 中 FormB 的 FormClosed 事件处理程序。
private void BtnClick(object sender, EventArgs e)
{
using(FormB fb = new FormB())
{
// Here the code returns only when the fb instance is hidden
result = fb.ShowDialog();
if(result == DialogResult.Yes)
{
//open Form C
}
}
}
现在应该去掉FormB代码中对Form.Close的调用,直接设置FormB的DialogResult属性,此时不要尝试改变DialogResult属性的按钮,这将不起作用,您需要再次单击以隐藏表单,而不是直接设置表单的 DialogResult 属性.
private const string password = "xxxyyyzzz";
private void BtnPW_Click(object sender, EventArgs e)
{
if(Verify())
this.DialogResult = DialogResult.Yes;
else
{
MessageBox.Show("Error: Incorrect password");
this.DialogResult = DialogResult.No;
}
}
通过这种方式,表单被隐藏(不是关闭)并且您的代码从 FormA 中的 ShowDialog 调用中退出。在 using 块中,您仍然可以使用 FormB 实例来读取其属性并采用适当的路径。当您的代码从 using 块中退出时,fb 实例将自动关闭并销毁。