我认为在构造函数中关闭表单是不明智的。如果您这样做,您的表单用户将不知道是否显示对话框。
以下代码可以正常使用:
// in the parent form:
public void ShowMyForm()
{
MyForm form = new MyForm();
form.propertyA = ...;
from.propertyB = ...;
DialogResult dlgResult = form.ShowDialog(this);
ProcessDialogResult(dlgResult);
}
如果你在构造函数中决定是否显示Form,则必须在构造后添加代码来决定是否调用ShowDialog以及是否处理对话框结果。
此外,您确定更改属性不会影响表单是否显示?也是在未来的变化之后?
在构建过程中,表单尚未显示/打开。所以恐怕Close() 没有达到你的预期。
简洁的方法是在 Form_Load 的构造函数中执行您想要执行的检查。为表单加载添加事件处理程序并在事件处理程序中进行检查。使用属性 DialogResult 来指示您决定不显示该表单。
private void FormMain_Load (object sender, EventArgs e)
{
if (FormShouldNotLoad())
{
this.DialogResult = System.Windows.Forms.DialogResult.Abort;
Close();
// Warning, this does not work, see below, (but we're almost there!)
}
}
代码的用户可以检查对话框的结果:
// in the parent form:
public void ShowMyForm()
{
MyForm form = new MyForm();
form.propertyA = ...;
from.propertyB = ...;
DialogResult dlgResult = form.ShowDialog(this);
switch (dlgResult)
{
case System.Windows.Forms.DialogResult.Abort:
ProcessFormNotLoaded();
break;
case System.Windows.Forms.DialogResult.OK:
ProcessFormOk();
break;
// etc.
}
}
但是,在表单加载的事件处理程序中调用 Close() 将不起作用,因为只有在加载完成后才能正确调用 Close()。
因此,不要调用Close(),而应该BeginInvoke Close() 函数,这样在加载完成后会调用Close 函数:
private void FormMain_Load (object sender, EventArgs e)
{
if (FormShouldNotLoad())
{
this.DialogResult = System.Windows.Forms.DialogResult.Abort;
// invoke the Close function after Load completed
this.BeginInvoke(new MethodInvoker( () => this.CancelLoading())
}
}