使用DialogShow()接收密码输入不起作用

时间:2017-11-13 18:00:50

标签: c# winforms dialogresult

我正在用C#编写WinForm应用程序。有一个Form AForm C点击时打开Button。现在,我想在打开Form B之前添加密码输入屏幕Form C。仅当输入的密码正确时,Form C才会打开,否则会显示错误消息。 Form B只有TextBox控件和验证 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;
}

有人可以告诉我这段代码有什么问题吗?它永远不会到达if中的第二个Form A语句。

修改:即使我输入正确的密码并点击Form B上的按钮,result中的Form A也会获得#34; DialogResult.Cancel`。

1 个答案:

答案 0 :(得分:1)

如果调用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调用。在使用块内,您仍然可以使用FormB实例来读取其属性并采用适当的路径。当你的代码从using块退出时,fb实例将自动关闭并且不再存在。