自定义ShowDialog,包含比dialog sult更多的信息
本文关键字:信息 sult dialog ShowDialog 包含比 自定义 | 更新日期: 2023-09-27 17:52:38
我需要一些比ShowDialog获得的传统OK或Cancel状态更多的信息,即来自自定义对话框窗体上的文本框的一些字符串。
我想知道逻辑是什么。我想这样命名它:
CustomDialog d = new CustomDialog();
DoStuffWith(d.ShowDialog().CustomString);
当然,必须有一个用于返回结果的定制类。让我们这样定义它:
class CustomDialogResult
{
public string CustomString { get; private set; }
public CustomDialogResult(string customString)
{
this.CustomString = customString;
}
}
然后我们需要在我们的CustomDialog: Form中重写ShowDialog方法。我想我们可以从窗体的父级显示开始。另外,向OK按钮添加一个事件处理程序,它将设置一个结果。
public CustomDialogResult CustomDialogResult { get; private set; }
private void buttonOK_Click(object sender, EventArgs e)
{
this.Result = new CustomDialogResult(this.TextBoxCustom.Text);
this.Close();
}
public CustomDialogResult ShowCustomDialog()
{
this.Show(Form.ActiveForm);
}
可以看到,问题在于等待OK按钮被点击,然后返回这个result。我可以使用Thread.Sleep(0)或ManualResetEvent,但这会阻止对话框表单上的输入。我该怎么做呢?我知道我可以使用更难看的语法,但如果ShowDialog做得很好,那么我们一定有办法做到这一点。:)
考虑OpenFileDialog
它使用标准的OK结果,并简单地通过属性和方法公开额外的信息。
要做到这一点,你只需要设置你的Ok按钮的对话sult为对话sult。好的,然后调用表单将通过属性或方法询问您的额外信息。
调用代码是这样的
CustomDialog d = new CustomDialog();
if(d.ShowDialog() == DialogResult.OK)
{
CustomDialogResult foo = d.CustomDialogResult;
DoStuff(foo.CustomString);
}
您可以在ShowCustomDialog()
方法中封装对ShowDialog()
的调用。这样,你就可以免费获得它所有的"魔力"。