Я думаю, что это не разумно, чтобы закрыть форму в конструкторе.Если вы сделаете это, пользователи вашей формы не будут знать, показывать ли 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.Cancel;
Close();
}
}
Пользователь кода может проверить результат диалога:
// 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.Cancel:
...
break;
case System.Windows.Forms.DialogResult.OK:
...
break;
// etc.
}
}
Однако это не будет работать, так как Закрыть можно назвать только после того, как правильно нагрузки завершена. Поэтому вместо вызова Close() вы должны выполнить BeginInvoke функцию Close(), после чего функция Close будет вызвана после завершения загрузки:
Код для завершения операции Close() после завершения загрузки будет следующим:
private void FormMain_Load (object sender, EventArgs e)
{
if (MyFunc())
{
CancelLoading();
}
}
private delegate void InvokeDelegate();
private void CancelLoading()
{ // will cancel loading this form
this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.BeginInvoke(new InvokeDelegate(CloseThisForm));
}
private void CloseThisForm()
{
this.Close();
}
Хорошо, что во время OnFormClosing и OnFormClosed вы точно знаете статус формы: она полностью загружена, поэтому вы знаете, что делать при закрытии.
Какое исключение вы получаете? –