Visual Studio c#DialogResult没有';似乎不起作用

本文关键字:不起作用 Studio c#DialogResult 没有 Visual | 更新日期: 2023-09-27 18:10:47

我使用的是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();

我知道该尝试什么,或者我可能会过度关注什么。

Visual Studio c#DialogResult没有';似乎不起作用

使用ShowDialog

newReg = new frmRegisterNew();
var dialogResult = newReg.ShowDialog();
if(dialogResult==DialogResult.OK)
{
    ....
}

ShowDialog方法是一个不错的方法,但要注意ShowShowDialog之间的差异。后者将是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提到的匿名函数,请注意,当出现问题时(尤其是当您对语言和框架相对陌生时(,它可能会很难调试。