单击该按钮两次以在显示对话框模式下关闭窗体



在主窗体上,我有按钮和方法:

private void button2_Click(object sender, EventArgs e)
{
    ShowMyDialogBox();
}
public void ShowMyDialogBox()
{
   testDialog= new Form3_addrow(tran_in);
   DialogResult dr = testDialog.ShowDialog(this);
   if (dr == DialogResult.Cancel)
   {
       testDialog.Close();
   }
   else if (dr == DialogResult.OK)
   {
       testDialog.Close();
       bool w= kd.dodaj(tran_in);
       if (w) MessageBox.Show("Transakcja dodana");
       else MessageBox.Show("Coś poszło nie tak...");
   }
}

和按钮打开Form3_addrow:

private void AcptBtn_Click(object sender, EventArgs e)
{
    zczytaj();
    this.AcptBtn.DialogResult = System.Windows.Forms.DialogResult.OK;
}

一切正常,但我必须单击此按钮两次。 在调试器模式下,我看到第一次单击时,按钮处理程序被调用,但仅此而已。第二次,再次调用处理程序,然后控件返回到 ShowMyDialogBox() 方法。

替换 :

this.AcptBtn.DialogResult = System.Windows.Forms.DialogResult.OK;

this.DialogResult = System.Windows.Forms.DialogResult.OK;

当窗体的"对话结果"设置为"确定"而不是按钮时,窗体将关闭。

补充一下@user3185569写的内容:

  1. 您可以将Form3_addrow窗体的Form.CancelButtonForm.AcceptButton属性设置为分别指向CancelOK按钮。在这种情况下,您甚至不需要Click事件处理程序,当您单击任一按钮时,表单将简单地自动设置DialogResult

  2. 您不必手动调用对话框实例上的Close,只需在完成后Dispose它。

使用模式对话框的常用方法是通过 using 指令,以确保在使用后立即释放它:

using (var addRowForm = new Form3_addrow(tran_in))
{
    var result = testDialog.ShowDialog(this);
    if (result == DialogResult.OK)
    {
        // no need to call Close here
        DoStuff();
    }
}

您需要这样做的原因是,模式对话框(即使用 ShowDialog() 而不是仅显示Show())仅在您关闭它(或将 DialogResult 属性设置为值)时隐藏自身,以允许您访问其属性,即使它不再显示,如 MSDN 中所述。