我正在使用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();
我确定要尝试什么,或者我可能会看到什么。
答案 0 :(得分:11)
使用ShowDialog
newReg = new frmRegisterNew();
var dialogResult = newReg.ShowDialog();
if(dialogResult==DialogResult.OK)
{
....
}
答案 1 :(得分:2)
ShowDialog
方法是一种很好的方法,但要注意Show
和ShowDialog
之间的差异。后者将是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,请注意在出现问题时很难调试(特别是如果你对语言和框架比较新的话)。