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