2008-10-27 65 views
5

我有点卡住了这个,所以我希望有人能帮助我。Windows窗体模态对话框返回一个对象而不是DialogResult

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

我只是不能看到如何做到这一点,而不是给对象的引用或取决于某些形式的公共属性以后读取数据。

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

我敢肯定,这个问题并不新鲜,但因为几乎没有人会做Winforms,所以我在网上找不到任何指导。

回答

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

+0

Dammit :)这几乎就是我所拥有的(除了我调用我的方法ShowDialog - 为什么不呢?)。 – 2008-10-27 09:50:16

0

或者您可以在您的表单类中创建一个新的ShowDialog方法,该方法基本上完成了Matt Hamilton的工作。如果这是你在问题中做了很多形式的事情,甚至可能是扩展方法。

2

可以代表返回值对话框中创建一个公共属性:

/* 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(); 
} 
0

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

相关问题