自定义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做得很好,那么我们一定有办法做到这一点。:)

自定义ShowDialog,包含比dialog sult更多的信息

考虑OpenFileDialog

它使用标准的OK结果,并简单地通过属性和方法公开额外的信息。

要做到这一点,你只需要设置你的Ok按钮的对话sult为对话sult。好的,然后调用表单将通过属性或方法询问您的额外信息。

调用代码是这样的

  CustomDialog d = new CustomDialog();
  if(d.ShowDialog() == DialogResult.OK)
  { 
      CustomDialogResult foo = d.CustomDialogResult;
      DoStuff(foo.CustomString); 
  }

您可以在ShowCustomDialog()方法中封装对ShowDialog()的调用。这样,你就可以免费获得它所有的"魔力"。