1

我需要比您通过 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 按钮,然后返回 this.Result。我可以使用 Thread.Sleep(0) 或 ManualResetEvent,但这会阻止对话框表单上的输入。我将如何处理这个?我知道我可以使用更丑陋的语法,但如果 ShowDialog 做得很好,我们必须有一种方法。:)

4

2 回答 2

3

考虑OpenFileDialog

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

要自己执行此操作,您只需将 Ok 按钮的DialogResult设置为 DialogResult.OK,然后您的调用表单将通过属性或方法询问您的额外信息。

所以调用代码看起来像这样

  CustomDialog d = new CustomDialog();

  if(d.ShowDialog() == DialogResult.OK)
  { 
      CustomDialogResult foo = d.CustomDialogResult;
      DoStuff(foo.CustomString); 
  }
于 2011-04-25T01:37:56.397 回答
2

你可以ShowDialog()在你的ShowCustomDialog()方法中包装一个调用。这样,您就可以免费获得它的所有“魔力”。

于 2011-04-25T01:25:31.087 回答