代码之家  ›  专栏  ›  技术社区  ›  Tigraine

返回对象而不是DialogResult的Windows窗体模态对话框

  •  5
  • Tigraine  · 技术社区  · 16 年前

    我有点纠结于这个,所以我希望有人能帮助我。

    我正在做一个Winforms应用程序,我需要显示一个模态对话框(form.ShowDialog),它返回一个值(提示用户一些值并将其包装在一个对象中)。

    我只是不知道如何做到这一点,而不是引用对象或依靠某种形式的公共属性来读取数据。

    我只是想让ShowDialog返回一些不同的东西,但这不起作用。 这是一种“好”的方法吗?

    我确信这个问题并不新鲜,但由于几乎没有人再做Winforms了,我在网上找不到任何指导。

    4 回复  |  直到 16 年前
        1
  •  12
  •   Matt Hamilton    16 年前

    在表单中添加一个静态方法,如下所示:

    public class MyDialog : Form
    {
        // todo: think of a better method name :)
        public static MyObject ShowAndReturnObject() 
        {
            var dlg = new MyDialog();
            if (new dlg.ShowDialog() == DialogResult.OK) 
            {
                var obj = // construct an instance of MyObject from dlg
                return obj;
            }
            else
            {
               return null; 
            }
        }
    }
    

    现在,您可以从程序中这样调用它:

    var myObject = MyDialog.ShowAndReturnObject();
    

    …如果他们取消对话框,myObject将为null。

    现在,说了这么多,我确实认为,在窗体的类中添加一个属性,然后在调用ShowDialog()后读取该属性是更好的方法。

        2
  •  2
  •   Konrad Viltersten    12 年前

    您可以在Dialog中创建一个表示返回值的公共属性:

    /* Caller Code */   
    var dlg = new MyDialog();
    if(dlg.ShowDialog() == DialogResult.OK)
      MessageBox.Show(dlg.MyResult);
    
    /* Dialog Code */
    public string MyResult { get { return textBox1.Text; } }
    
    private void btnOk_Click(object sender, EventArgs e)
    {
      DialogResult = System.Windows.Forms.DialogResult.OK;
      this.Close();
    }
    
        3
  •  0
  •   Kieron    16 年前

    或者,您可以在窗体类中创建一个新的ShowDialog方法,该方法基本上与Matt Hamilton的方法相同。如果你对问题中的许多表单都做了扩展方法,也许甚至是一种扩展方法。

        4
  •  0
  •   mjhillman    12 年前

    对话形式中的公共属性是有意义的。但是,不要关闭“确定”按钮单击事件处理程序中的对话框。当您指定DialogResult属性时,对话框窗体将隐藏。然后,在调用表单中,您可以通过检查DialogResult来确定是单击了“确定”还是“取消”。然后,如果单击了“确定”按钮,则可以访问公共属性,然后处理对话框窗体。这应该使用调用窗体中的try-catch finally块或通过using语句来完成。您必须丢弃模式对话框以防止内存泄漏。