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

Winforms Windows窗体返回对象而不是DialogResult的模态对话框,winforms,forms,modal-dialog,Winforms,Forms,Modal Dialog,我有点受不了这个,所以我希望有人能帮我 我正在做一个Winforms应用程序,我需要显示一个模式对话框(form.ShowDialog),它返回一个值(提示用户一些值并将它们包装到一个对象中) 我只是不知道如何做到这一点,而不是给对象一个引用,或者依赖某种形式的公共属性来读取数据 我只是想让ShowDialog返回一些不同的内容,但这不起作用。 有什么“好”的方法吗 我确信这个问题并不新鲜,但由于几乎没有人再使用Winforms,我在web上找不到任何指导。在表单中添加静态方法,如下所示: pu

我有点受不了这个,所以我希望有人能帮我

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

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

我只是想让ShowDialog返回一些不同的内容,但这不起作用。 有什么“好”的方法吗


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

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

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方法,基本上与Matt Hamilton的方法相同。如果是对问题中的许多表单执行的操作,甚至可能是一种扩展方法。

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

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

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

Dammit:)这几乎正是我所拥有的(除了我调用了我的方法ShowDialog——为什么不呢?)。嗯-我没有调用我的ShowDialog,因为我担心尝试使用与实例方法同名的静态方法,只通过返回类型重载。我认为那不可能,嗯?这两个代码块都是缩进的,语法突出显示对我来说很好。为什么该方法需要是静态的?它不需要,但是静态方法意味着不需要实例化表单然后显示它。