2

我正在使用 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在属性窗口中将此按钮设置为“确定”,我认为在代码中也是如此。单击第二种形式的“注册”按钮时,它会检查输入,尝试更新数据库并在成功时关闭。这是那段代码:

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

4 回答 4

11

利用ShowDialog

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

if(dialogResult==DialogResult.OK)
{
    ....
}
于 2013-04-23T21:18:53.080 回答
2

该方法是一个很好的方法,但要注意和ShowDialog之间的区别。后者将意味着在新表单关闭之前您无法访问原始表单。这就是它阻止检查的原因,可能是也可能不是你想要的。ShowShowDialogmodal

当您调用 时Show,它不会阻塞,这就是为什么您的代码会立即检查是否DialogResult等于OK(它不等于,OK因为在进行检查时您的新表单几乎没有打开)。

ShowDialog如果您想使用using ,另一种方法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");
}
于 2013-04-23T21:29:13.140 回答
1

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

DialogResult dr = new DialogResult();

newReg = new frmRegisterNew();
dr = frmResgisterNew.ShowDialog();
if ( dr == DialogResult.OK )
   //Take an action here.
于 2013-04-23T21:21:07.437 回答
0

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

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

(通过Form.DialogResult 属性 msdn 库页面

您可以调用From.ShowDialog(),或者,如果您需要在主窗体上保持交互,则传递一个委托以供另一个窗体在完成时调用。


编辑:要记住几点:

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

  • 但是,如果您最终使用ShowDialog()而不是Show()this.Close()则不会处理该表单。事实上,它基本上什么都不做,因为设置DialogResult为除了None会自动隐藏表单之外的任何东西。如果您需要确定性清理(大概是您Close()首先打电话的原因),您应该newReg.Dispose()btnRegisterNew_Click. 否则,表单将在未来某个不可预测的时间被处理(前提是您的应用程序在此期间没有异常结束)。

  • 如果您使用keyboardP 提到的匿名函数,请注意当出现问题时它可能很难调试(特别是如果您对语言和框架相对较新)。

于 2013-04-23T21:20:10.757 回答