我使用的是visual studio 2010frmMain
有一个"注册"按钮,它调用另一种形式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();
我知道该尝试什么,或者我可能会过度关注什么。
使用ShowDialog
newReg = new frmRegisterNew();
var dialogResult = newReg.ShowDialog();
if(dialogResult==DialogResult.OK)
{
....
}
ShowDialog
方法是一个不错的方法,但要注意Show
和ShowDialog
之间的差异。后者将是modal
,这意味着在关闭新表单之前,您无法访问原始表单。这就是为什么它会阻止检查,可能是也可能不是你想要的。
当您调用Show
时,它不会阻塞,所以这就是为什么您的代码会立即检查DialogResult
是否等于OK
(它不等于OK
,因为在进行检查时,您的新表单刚刚打开(。
如果要使用Show
,则使用ShowDialog
的替代方法是处理新表单的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");
}
尝试实例化DialogResult类并以这种方式使用它:
DialogResult dr = new DialogResult();
newReg = new frmRegisterNew();
dr = frmResgisterNew.ShowDialog();
if ( dr == DialogResult.OK )
//Take an action here.
Form.Show()
是非阻塞的,并且将很快返回。因此,您对newReg.DialogResult.Equals(DialogResult.OK))
的检查将在用户有机会按下按钮之前进行。此外,请注意关于关闭窗口的警告:
如果窗体显示为无模式窗口,则DialogResult属性返回的值可能不会返回分配给窗体的值,因为窗体的资源在窗体关闭时会自动释放。
(通过Form.DialogResult属性msdn库页面(
您可以调用From.ShowDialog()
,或者,如果需要在主窗体上保持交互,则在完成时传递一个委托给另一个窗体进行调用。
编辑:需要记住的几点:
-
除了上面关于关闭表单的警告之外,您还必须小心,在处理完
newReg
的消息循环(包括调用Close()
的函数(后,尝试访问该方法发送的内容。 -
然而,如果您最终使用
ShowDialog()
而不是Show()
,this.Close()
将不会处理该表单。事实上,它基本上什么都不做,因为将DialogResult
设置为除None
之外的任何值都会自动隐藏该表单。如果您需要确定性清理(大概是您最初调用Close()
的原因(,则应该在btnRegisterNew_Click
中调用newReg.Dispose()
。否则,表单将在未来某个不可预测的时间被处理(前提是您的申请在此期间不会异常结束(。 -
如果您使用keyboardP提到的匿名函数,请注意,当出现问题时(尤其是当您对语言和框架相对陌生时(,它可能会很难调试。