在Form Modal时,DialogResult需要两次单击OK

时间:2014-01-17 21:54:09

标签: c# modal-dialog showdialog

我有Child form我需要Modal,所以当然我使用child.ShowDialog()制作表格Modal。在此form中,如果用户选择close/cancel按钮,则会DialogResult询问他们是否确定他们希望关闭。当用户在OK上选择DialogResult时,会出现此问题。它需要在OK上点击两次才能关闭DialogResult box。我发现如果我使用Dispose以及Close我可以在第一次点击时让child form消失,但DialogResult box仍然存在。我在下面的代码中遗漏了哪些内容,DialogResult boxForm只需点击OK即可关闭?

private void closeButton_Click(object sender, EventArgs e)
{
    if (calBackgroundWorker.IsBusy)
    {
        DialogResult dialogResult = MessageBox.Show("The Compass Calibration is already in progress, are you sure you wish to cancel?", "Stop Calibration", MessageBoxButtons.OKCancel);
        if (dialogResult == DialogResult.OK)
        {
            calibrationInProgress = false;
            calBackgroundWorker.CancelAsync();
            this.Dispose();
            this.Close();
        }
    }
    else
    {
        this.Close();
    }
}

2 个答案:

答案 0 :(得分:1)

首先,您不需要Dispose()来电,Close()就足够了。但是,您的BackgroundWorker.CancelAsync()调用不会立即(同步)取消任务。这取决于DoWork的实施,但您仍然会收到一个RunWorkerCompleted事件,您可以在其中处理已取消的状态。

你想要这样的东西:

void closeButtonClicked(object sender, EventArgs e)
{
  if(backgroundWorker.IsBusy)
  {
    var result = MessageBox.Show("...");

    if(result == DialogResult.OK)
      backgroundWorker.CancelAsync();

    return;
  }

  this.Close();
}

然后在你的事件处理程序中:

void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  if(e.Cancel)
  {
    this.Close();
    return;
  }
}

答案 1 :(得分:0)

通过SiLo回答,我得到了更多,但只有DialogResult会关闭,而不是ChildForm。要允许两者都关闭,我需要添加this.DialogResult = DialogResult.OK。以下代码适用于关闭Modal个窗口:

private void closeButton_Click(object sender, EventArgs e)
{
    if (calBackgroundWorker.IsBusy)
    {
        DialogResult dialogResult = MessageBox.Show("The Compass Calibration is already in progress, are you sure you wish to cancel?", "Stop Calibration", MessageBoxButtons.OKCancel);
        if (dialogResult == DialogResult.OK)
        {
            calBackgroundWorker.CancelAsync();
            this.DialogResult = DialogResult.OK;
        }
        return;
    }
    this.Close();
}

事件处理程序:

void calBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        this.Close();
        return;
    }
}
相关问题