我需要比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);
}
正如您所看到的,问题在于等待单击“确定”按钮,然后返回此结果。结果。我可以使用Thread.Sleep(0)或ManualResetEvent,但这会阻止对话框窗体上的输入。我怎么去这个?我知道我可以使用更丑陋的语法,但如果ShowDialog做得很好,我们必须有办法。 :)
答案 0 :(得分:3)
它使用标准的OK结果,只需通过属性和方法公开额外的信息。
要自己动手,你只需要将Ok Button的DialogResult设置为DialogResult.OK,然后你的调用表格将通过属性或方法查询你的额外信息。
所以调用代码看起来像这样
CustomDialog d = new CustomDialog();
if(d.ShowDialog() == DialogResult.OK)
{
CustomDialogResult foo = d.CustomDialogResult;
DoStuff(foo.CustomString);
}
答案 1 :(得分:2)
您可以在ShowDialog()
方法中打包到ShowCustomDialog()
。这样,你就可以得到所有的魔法"免费。