在主窗体上,我有按钮和方法:
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写的内容:
-
您可以将
Form3_addrow
窗体的Form.CancelButton
和Form.AcceptButton
属性设置为分别指向Cancel
和OK
按钮。在这种情况下,您甚至不需要Click
事件处理程序,当您单击任一按钮时,表单将简单地自动设置DialogResult
。 -
您不必手动调用对话框实例上的
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 中所述。