【问题标题】:Windows Forms Modal Dialog that returns an Object rather than DialogResult返回对象而不是 DialogResult 的 Windows 窗体模态对话框
【发布时间】:2010-09-19 08:38:46
【问题描述】:

我有点坚持这个,所以我希望有人可以帮助我。

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

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

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

我确定这个问题不是新问题,但由于似乎几乎没有人再使用 Winforms,所以我在网络上找不到任何指导。

【问题讨论】:

    标签: winforms forms modal-dialog


    【解决方案1】:

    向表单添加静态方法,如下所示:

    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 将为空。

    现在,说了这么多,我确实相信向表单的类添加一个属性,然后在调用 ShowDialog() 后从中读取该属性是更好的方法。

    【讨论】:

    • 该死 :) 这几乎就是我所拥有的(除了我将我的方法称为 ShowDialog —— 为什么不呢?)。
    • 嗯 - 我没有调用我的 ShowDialog '因为我担心尝试使用与实例方法同名的静态方法,仅通过返回类型重载。我认为这是不可能的。
    • 嗯?两个代码块都是缩进的,语法高亮对我来说很好。
    • 为什么方法需要是静态的?
    • 它没有,但是静态方法意味着您不需要实例化表单然后显示它。
    【解决方案2】:

    或者您可以在表单类中创建一个新的 ShowDialog 方法,该方法基本上可以完成 Matt Hamilton 所做的工作。如果您对问题中的许多表单执行此操作,甚至可能是一种扩展方法。

    【讨论】:

      【解决方案3】:

      您可以在 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();
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-01
          • 1970-01-01
          • 2023-03-17
          • 1970-01-01
          • 2010-10-29
          • 2012-05-22
          • 2011-07-22
          相关资源
          最近更新 更多