5

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

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

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

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

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

4

4 回答 4

12

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

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() 之后读取该属性是更好的方法。

于 2008-10-27T09:49:14.753 回答
2

您可以在 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();
}
于 2012-10-06T23:18:59.880 回答
0

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

于 2008-10-27T09:55:37.797 回答
0

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

于 2013-06-24T18:57:52.070 回答