Я думаю, что не стоит закрывать форму в конструкторе. Если вы сделаете это, пользователи вашей формы не будут знать, показывать ли ShowDialog или нет.
Следующий код будет вполне нормальным использованием:
// in the parent form:
public void ShowMyForm()
{
MyForm form = new MyForm();
form.propertyA = ...;
from.propertyB = ...;
DialogResult dlgResult = form.ShowDialog(this);
ProcessDialogResult(dlgResult);
}
Если вы решили в конструкторе, должна ли форма отображаться, вам нужно будет добавить код после построения, чтобы решить, вызывать ли 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())
}
}