Visual Studio c#DialogResult似乎不起作用

时间:2013-04-23 21:15:47

标签: c# visual-studio-2010 dialogresult

我正在使用visual studio 2010 frmMain有一个“注册”按钮,可以调用另一种形式newReg

这是frmMain中调用第二种形式的按钮的代码。问题是MessageBox("So Far So Good")永远不会被调用。 dialogResult似乎没有得到认可。

private void btnRegisterNew_Click(object sender, EventArgs e)
{
   // newReg Constructor Call
   newReg = new frmRegisterNew();

   // show form
   newReg.Show();

   if (newReg.DialogResult.Equals(DialogResult.OK)) 
   {
      MessageBox.Show ("So Far So Good");
   }
}

第二种形式有一些要填写的字段和一个按钮“注册”。我已经在属性窗口中将此按钮的dialogResult设置为“ok”,我认为也在代码中。单击第二种形式的“注册”按钮时,它会检查输入,尝试更新数据库并在成功时关闭。这是一段代码:

dbConnection db = new dbConnection();
db.dbConnect();
if (db.dbRegisterVehicle(txtNewReg.Text, txtNewMake.Text, txtNewModel.Text, txtNewColour.Text, OwnerID))
{
   // if insert worked close
   this.DialogResult = DialogResult.OK;
   this.Close();
}
db.dbDisconnect();

我确定要尝试什么,或者我可能会看到什么。

4 个答案:

答案 0 :(得分:11)

使用ShowDialog

newReg = new frmRegisterNew();
var dialogResult = newReg.ShowDialog();

if(dialogResult==DialogResult.OK)
{
    ....
}

答案 1 :(得分:2)

ShowDialog方法是一种很好的方法,但要注意ShowShowDialog之间的差异。后者将是modal,这意味着在新表单关闭之前,您无法访问原始表单。这就是它阻止支票的原因,可能是也可能不是你想要的。

当您致电Show时,它不会阻止,因此您的代码会立即检查以查看DialogResult是否等于OK(它不等于OK因为您的新表单在检查时几乎没有打开过来。

如果您想使用ShowDialog,则使用Show的替代方法是处理新表单的closed事件。

frmRegisterNew newReg = new frmRegisterNew();    
newReg.FormClosed += (s, o) =>
    {
        if (newReg.DialogResult == DialogResult.OK)
        {
            MessageBox.Show ("So Far So Good");
        }
    };
newReg.Show();

这意味着您的代码将继续工作,您的新表单将不是模态的,但是当新表单关闭时,FormClosed事件处理程序将被触发。如果您不熟悉上面的事件处理程序表示法(它们被称为匿名方法),请不要担心,但您仍然可以正常使用事件处理程序。

newReg.FormClosed += new FormClosedEventHandler(newReg_FormClosed);

void newReg_FormClosed(object sender, FormClosedEventArgs e)
{
    MessageBox.Show ("So Far So Good");
}

答案 2 :(得分:1)

尝试实例化DialogResult类并以这种方式使用它:

DialogResult dr = new DialogResult();

newReg = new frmRegisterNew();
dr = frmResgisterNew.ShowDialog();
if ( dr == DialogResult.OK )
   //Take an action here.

答案 3 :(得分:0)

Form.Show()是非阻止的,并且会很快返回。因此,在用户有机会按下按钮之前,您的newReg.DialogResult.Equals(DialogResult.OK))检查就会发生。此外,请注意关于关闭窗口的此警告:

  

如果表单显示为无模式窗口,则DialogResult属性返回的值可能不会返回分配给表单的值,因为表单的资源会在表单关闭时自动释放。

(通过Form.DialogResult Property msdn library page

您可以拨打From.ShowDialog(),或者,如果您需要在主表单上保持互动,请传递另一个表单的委托,以便在完成时调用。


编辑:要记住几点:

  • 除了上面关于关闭表单的警告之外,还必须小心尝试从newReg的消息循环调度的方法中访问内容(包括调用{{ 1}})处理完毕后。

  • 但是,如果您最终使用的是Close()而不是ShowDialog(),则Show()将不会处理该表单。实际上,它基本上什么都不做,因为将this.Close()设置为DialogResult以外的任何内容都会自动隐藏表单。如果您需要确定性清理(可能是您首先调用None的原因),则应在Close()完成后调用newReg.Dispose()。否则,表格将在未来某个不可预测的时间处理(如果您的申请在过渡期间没有异常结束)。

  • 如果你使用keyboardP提到的anonymous function,请注意在出现问题时很难调试(特别是如果你对语言和框架比较新的话)。

相关问题