2011-07-30 29 views
6

Tengo un formulario Form1 del cual visualizo Form2 como formulario modal. Desde Form2 hago todo tipo de edición y eliminación de diferentes conjuntos de valores que deben reflejarse en Form1 después de cerrar Form2. Entonces, lo que hago es RePopulateControls_in_Form1() después de cerrar Form2. Dado que RePopulateControls_in_Form1() es un proceso largo, quiero ejecutar ese método solo si ocurre alguna modificación (editar, agregar, borrar) en Form2 y no cuando se acaba de abrir y cerrar Form2.DialogResult que no cierra el formulario?

Así que esto es lo que trato de hacer en Form1:

 Form2 f = new Form2(); 
     if (f.ShowDialog(this) == DialogResult.Something) 
      RePopulateControls_in_Form1() 

Y luego, en Form2 hago,

private void bntEdit() 
    { 
     //If Edit? 
     this.DialogResult = DialogResult.Something; 
    } 
    private void bntAdd() 
    { 
     //If Add? 
     this.DialogResult = DialogResult.Something; 
    } 
    private void bntDelete() 
    { 
     //If Delete? 
     this.DialogResult = DialogResult.Something; 
    } 

Pero mi problema es .Something. Si se trata de algo distinto de .None, Form2 simplemente se cierra. No quiero que Form2 simplemente se cierre solo a menos que el usuario lo cierre.

Si hago esto:

RePopulateControls_in_Form1() no es golpeado!

En resumen, en mi programa, ¿cómo puedo decirle al compilador que llame al RePopulateControls_in_Form1() solo si los valores se modifican en Form2?

Nota: La repoblación es necesaria ya que los controles se crean dinámicamente y son un poco complejos (en realidad, lo que se crea en Form2 son los controles de la GUI y sus etiquetas, etc.).

Respuesta

10

Establecer DialogResult en el formulario oculta el formulario y lo devuelve desde ShowDialog. Si desea retrasar eso hasta que el usuario realice alguna otra acción (como cerrar el formulario), debe almacenar ese estado como un campo de miembro y establecer DialogResult en un controlador para Form.Closing.

Además, si desea cerrar el formulario modal presionando un botón, puede usar la propiedad Button.DialogResult en lugar de crear un controlador Button.Click.

0

Usaría un evento en el Formulario 2. Incendie ese evento cuando se cierre su Form2. Manejar ese evento en Form1 le permitirá llevar a cabo cualquier procesamiento que desee. Además, si fuera necesario, podría devolver cierta información de Form2 a Form1 en los parámetros del evento.

Una alternativa sería configurar una variable estática global, quizás solo un bool. Entonces Form2 puede establecerlo en verdadero o falso dependiendo de si se han realizado cambios. Form1 puede leer esto cuando el Formulario 2 retorna y si es verdadero lleva a cabo el proceso y lo vuelve a establecer como falso.

+0

OK ¡Obtengo la primera parte, pero la segunda lógica no es una técnica de codificación adecuada! – nawfal

+1

¿Por qué no lo es? En el caso anterior, usaría un evento. Sin embargo, si hay un valor que se utiliza en una aplicación que tiene 20 formularios y diez veces más que muchas clases, ¿cómo se aseguraría de que solo se use un valor? ¿Prefiere pasar el valor de la forma a la forma y de la clase a la clase a través de un parámetro o propiedades del constructor ... – ScruffyDuck

+0

Esto es algo tan simple como simplemente configurar una bandera para que Form1 sepa algo sobre Form2.¿Por qué una variable global que no es segura para subprocesos? Entiendo la importancia de una variable global general cuando tienes que usarla en 220 clases como mencionas arriba. Pero aquí, no solo debemos evitar las variables estáticas, que duermen a lo largo de todo el ciclo de vida de la aplicación, tanto como sea posible, pero lo que es más importante, me pregunto cómo prevería que el requisito mencionado en la pregunta fuera algo así como grande como para ser empleado en 220 clases de mi pregunta simple :) – nawfal

2

Una manera simple podría ser no usar DialogResult sino una propiedad dedicada que no interfiera con el comportamiento del Formulario. - Entonces debería poder programar cualquier lógica que desee.

+0

Gracias. Eso fue lo que hice. – nawfal

+0

Pero siento que @Ryan Russell tiene una llamada tan genial ... Déjenme marcar su – nawfal

Cuestiones relacionadas