creo que no es aconsejable para cerrar un formulario en el constructor.Si hace esto, los usuarios de su formulario no sabrían si mostrar o no ShowDialog.
El siguiente código sería el uso normal:
// in the parent form:
public void ShowMyForm()
{
MyForm form = new MyForm();
form.propertyA = ...;
from.propertyB = ...;
DialogResult dlgResult = form.ShowDialog(this);
ProcessDialogResult(dlgResult);
}
que tendrá que añadir un código especial para decidir si ShowDialog y si desea procesar el resultado de diálogo.
Además, ¿está seguro de que las propiedades nunca influirán en si se debe mostrar el formulario o no? ¿También después de cambios futuros?
Durante la construcción, el formulario aún no se muestra/abre. Entonces me temo que Close() no hace lo que esperas.
El método perfecto es hacer sus verificaciones en Form_Load. Agregue el controlador de eventos de carga de formulario y realice sus comprobaciones en ese momento. Use la propiedad DialogResult para indicar que decidió no mostrar el formulario.
private void FormMain_Load (object sender, EventArgs e)
{
if (FormShouldNotLoad())
{
this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
Close();
}
}
El usuario del código podría comprobar el resultado del diálogo:
// 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.
}
}
Sin embargo, esto no va a funcionar, porque Cerrar sólo puede ser llamado correctamente Después de cargar. Por lo tanto, en lugar de llamar a Cerrar(), debe iniciar la función Cerrar() para llamar a la función Cerrar después de completar la carga:
El código para llamar a Cerrar() después de cargarse será como sigue:
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();
}
Lo bueno es que durante OnFormClosing y OnFormClosed usted sabe exactamente el estado del formulario: está completamente cargado, por lo que sabe qué hacer al cerrar.
¿Qué excepción obtienes? –