2014-01-18 65 views
-1

在主窗体我有按钮和方法:点击按钮两次关闭形式的ShowDialog模式

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()方法。

+0

您应该使用对话框的方式是在完成后使其自动关闭**。你不应该从外面关闭它,而只是检查对话结果。 – Groo

回答

0

要添加到what @user3185569 wrote

  1. 您可以为您的Form3_addrow形式Form.CancelButtonForm.AcceptButton性质分别指向您CancelOK按钮。在这种情况下,您甚至不需要事件处理程序,只要单击其中一个按钮,表单就会自动设置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中所述。

3

替换:

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

随着

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

当它的DialogResult设置为OK,而不是该按钮的形式将关闭。