【问题标题】:Visual Studio c# DialogResult doesn't seem to workVisual Studio c# DialogResult 似乎不起作用
【发布时间】:2013-04-23 21:15:46
【问题描述】:

我正在使用 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();

我确定要尝试什么,或者我可能会忽略什么。

【问题讨论】:

    标签: c# visual-studio-2010 dialogresult


    【解决方案1】:

    使用ShowDialog

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

    【讨论】:

    • 啊!回到工作!谢谢!
    【解决方案2】:

    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");
    }
    

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      (通过Form.DialogResult Property msdn library page

      您可以调用From.ShowDialog(),或者,如果您需要在主表单上保持交互,则传递一个委托,以便其他表单在完成时调用。


      编辑:需要记住的几点:

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

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

      • 如果您使用键盘 P 中提到的 anonymous function,请注意当出现问题时可能很难调试(尤其是如果您对语言和框架比较陌生)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-02
        • 1970-01-01
        • 2018-10-26
        • 2010-12-08
        • 2014-05-27
        • 1970-01-01
        相关资源
        最近更新 更多