需要单击按钮两次才能关闭对话框

A Button needs to be clicked twice to close a Dialog

我正在尝试运行一个简单的代码。我创建了一个带有 ComboBox (DropDownStyle = DropDown) 的 Form,开始时它是空的,当打开 DropDown 时它被填充了两个。
此表单还有 2 个按钮,其中之一是代码中的 proceedButton 按钮。

在这段代码中,我检查 ComboBox 是否为空,如果为空,我提示用户 select ComboBox 中的一个项目。
selected 项目时,我想单击 proceedButton 并且表单应该关闭,但此操作需要第二次单击。

private void exitButton_Click(object sender, EventArgs e)
{
    exitButton.DialogResult = DialogResult.Cancel;
    Debug.WriteLine("Cancel was clicked");
    Close();
}

private void proceedButton_Click(object sender, EventArgs e)
{
    if (string.IsNullOrEmpty(comboBox1.Text))
    {
        MessageBox.Show("Nothing was selected, please try again!");
    }
    else
    {
        proceedButton.DialogResult = DialogResult.OK;
        Debug.WriteLine("Proceed was clicked");
    }
}

你知道这是为什么吗?

按钮控件有 DialogResult property you can set to one of the DialogResult 个值。

  • 单击将其 DialogResult 属性 设置为非 DialogResult.None 值的按钮会导致对话框关闭,同时设置返回值通过 Form.ShowDialog():

    DialogResult result = Form.ShowDialog().  
    

Buttons的DialogResult属性一般是在​​Designer或者Form Constructor中设置的(同理)

  • 单击带有 DialogResult = DialogResult.Cancel 的按钮时,对话框将关闭。 Form.ShowDiaog().
  • 返回相同的值
  • 这同样适用于具有 DialogResult = DialogResult.OK 的按钮。

因此,在设计器中设置这些属性,从 exitButton 按钮 Click 处理程序中删除 Close()(此操作已自动执行)。

  • 您需要点击 OK 两次,因为第一次点击只是设置 DialogResult 属性,然后确认并仅在第二次点击时执行其默认操作。

proceedButton 按钮 Click 处理程序的错误条件下,设置 this.DialogResult = DialogResult.None; 以在显示 MessageBox 之前取消操作。

然后可以在以下位置更改代码:

private void exitButton_Click(object sender, EventArgs e)
{
    Debug.WriteLine("Cancel was clicked");
}

private void proceedButton_Click(object sender, EventArgs e)
{
    if (string.IsNullOrEmpty(comboBox1.Text)) {
        this.DialogResult = DialogResult.None;
        MessageBox.Show("Nothing was selected, please try again!");
    }
    else {
        Debug.WriteLine("Proceed was clicked");
    }
}