首页 文章

自定义表单始终返回DialogResult.Cancel

提问于
浏览
0

我已经实现了一个用作DialogBox的表单,我使用ShowDialog方法并检索它的DialogResult,它由它实现的两个按钮设置:

DialogResult dialogResult = registerForm.ShowDialog(); 

private void btRegister_Click(object sender, EventArgs e)
{
    DialogResult = !string.IsNullOrEmpty(Key) ? DialogResult.OK : DialogResult.None;
    Close();
}

private void btCancel_Click(object sender, EventArgs e)
{
    DialogResult = DialogResult.Cancel;
    Close();
}

问题是,即使DialogResult属性设置为None或OK,ShowDialog返回的值也始终为Cancel .

我错过了什么?

1 回答

  • 1

    调用Close会将DialogResult属性设置为Cancel覆盖在调用Close之前设置的任何内容 . 您可以使用调试器轻松验证这一点,并在调用Close之前和之后检查this.DialogResult的值 .

    但是,当表单以模态方式显示时,您不需要,通常不应该调用Close . 您可以隐藏表单只是设置属性DialogResult导致您的代码退出调用ShowDialog .

    设置DialogResult属性但仅隐藏时,不会关闭以模态方式显示的表单 . 这允许调用代码访问表单的属性并采取适当的操作 .

    此外,最好将表单的初始化调用包含在using语句中,以便在不再需要时自动处理 modal 表单 . (当然,非模态显示的表格不是这种情况)

    using(RegisterForm registerForm = new RegisterForm())
    {
         DialogResult dialogResult = registerForm.ShowDialog(); 
         if(dialogResult == DialogResult.OK)
         {
            .....
         }
    }  
    // <== At this point the registerForm instance has been Closed and Disposed 
    //     It is no more in scope and you cannot use it in any way
    ....
    private void btRegister_Click(object sender, EventArgs e)
    {
        DialogResult = !string.IsNullOrEmpty(Key) ? 
                        DialogResult.OK : DialogResult.None;
    }
    
    private void btCancel_Click(object sender, EventArgs e)
    {
        DialogResult = DialogResult.Cancel;
    }
    

相关问题