我有点坚持这个,所以我希望有人能帮助我。
我正在做一个 Winforms 应用程序,我需要显示一个返回值的模态对话框 (form.ShowDialog)(提示用户一些值并将它们包装在一个对象中)。
我只是看不到如何做到这一点,而不是引用对象或依赖某种形式的公共属性来读取数据。
我只想让 ShowDialog 返回一些不同的东西,但这不起作用。有一些“好”的方法来做到这一点吗?
我确信这个问题并不新鲜,但由于似乎几乎没有人再使用 Winforms,所以我在网上找不到任何指导。
我有点坚持这个,所以我希望有人能帮助我。
我正在做一个 Winforms 应用程序,我需要显示一个返回值的模态对话框 (form.ShowDialog)(提示用户一些值并将它们包装在一个对象中)。
我只是看不到如何做到这一点,而不是引用对象或依赖某种形式的公共属性来读取数据。
我只想让 ShowDialog 返回一些不同的东西,但这不起作用。有一些“好”的方法来做到这一点吗?
我确信这个问题并不新鲜,但由于似乎几乎没有人再使用 Winforms,所以我在网上找不到任何指导。
在表单中添加一个静态方法,如下所示:
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() 之后读取该属性是更好的方法。
您可以在 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();
}
或者,您可以在表单类中创建一个新的 ShowDialog 方法,该方法基本上完成了 Matt Hamilton 的工作。如果您对问题中的许多表单执行此操作,甚至可能是一种扩展方法。
对话框表单中的公共属性是有意义的。但是,不要在 Ok 按钮单击事件处理程序中关闭对话框。当您分配 DialogResult 属性时,对话框表单将被隐藏。然后在调用表单中,您可以通过检查 DialogResult 来确定是否单击了 Ok 或 Cancel。然后,如果单击 Ok 按钮,您可以访问公共属性,然后处理对话框表单。这应该使用调用表单中的 try-catch-finally 块或通过 using 语句来完成。您必须处理模态对话框以防止内存泄漏。