¿Hay alguna forma de llamar a una función que está presente en el formulario principal (usuarios), donde se llama a una instancia de un segundo formulario (addNewUser)? Lo que quiero hacer es cuando se cierra el segundo formulario, ejecutar una función en el formulario principal (usuarios) que está actualizando una tabla para que los cambios realizados en el segundo (addNewUser) se actualicen en la tabla del primer formulario ( usuarios).

un dibujo simple de lo que estoy tratando de lograr

1
dannkis 27 nov. 2021 a las 12:41
No debería tener el código de acceso a la base de datos directamente en el código del formulario, extraerlo en clases de servicio y todos estos problemas desaparecerán.
 – 
DavidG
27 nov. 2021 a las 12:43
Si tiene un objeto en el formulario, puede llamar al método de instancia por el objeto; de lo contrario, puede llamar al método de estado utilizando el nombre de la clase del formulario.
 – 
vivek nuna
27 nov. 2021 a las 12:45

2 respuestas

La mejor respuesta

Con un paradigma impulsado por eventos como WinForms, el mejor camino es usar los eventos cuando hay uno que puede interceptar.
Puedes suscribirte a un evento de cualquier clase que cree instancias del evento raiser. En este caso, simplemente podría vincular un controlador de eventos al evento FormClosed generado por el segundo formulario.

// Suppose you have a button click that opens the second form.
private void button_Click(object sender, EventArgs e)
{
    SecondForm f = new SecondForm();
    f.FormClosed += onSecondFormClosed;
    f.ShowDialog();
}

private void onSecondFormClosed(object sender, FormClosedEventArgs e)
{
    // Do whatever you need to do when the second form closes
}
1
Steve 27 nov. 2021 a las 12:56
Estuve buscando esto durante tanto tiempo que ni siquiera puedo ...
 – 
dannkis
27 nov. 2021 a las 13:03
Si realmente desea profundizar en el negocio de eventos, puede comenzar a pensar en generar un evento personalizado cuando presione el botón Agregar y no cierre el segundo formulario para que su usuario pueda agregar otra entrada sin cerrar y volver a abrir el segundo formulario. El evento personalizado podría incluso publicar datos personalizados en el formulario principal (como una instancia de una clase de usuario para que el padre pueda agregar la información a su lista)
 – 
Steve
27 nov. 2021 a las 13:06
Estoy usando una base de datos, por lo que puede agregar varios usuarios cuando se abre el segundo formulario. Mi onSecondFormClosed solo está recuperando la nueva información de la base de datos y la muestra en la tabla dataGridView que tengo en mi primer formulario
 – 
dannkis
27 nov. 2021 a las 13:16

Defina variables globales para identificar sus instancias de sus formularios:

internal static Form1 CurrentForm1 { get; set; }
internal static Form2 Frm2 { get; set; }

Luego, afecte las variables de la siguiente manera:

  public Form1()
    {
        InitializeComponent();
        CurrentForm1 = this;
    }

En algún lugar de su código, definirá Form2:

Frm2 = new Form2();

Ahora, desde el código Frm2, accederá a los métodos no estáticos de form1 con:

Form1.CurrentForm1.UpdateMyThings();

Y desde el código Frm1, podrá ver las cosas en Frm2, como:

bool notified = false;
while (Frm2.backgroundWorker1.IsBusy)
{
    if (notified == false)
    {
        Message("Please wait...");
        notified = true;
    }
    Application.DoEvents();
}

En este ejemplo, Frm1 comprueba si el backgroundworker # 1 todavía se está ejecutando en Frm2 (la función Mensaje puede mostrar el mensaje en una etiqueta o algo así).

0
Fredy 27 nov. 2021 a las 13:00
Una muy buena forma de hacerlo, simplemente lo encuentro demasiado complejo (sé que no lo es) para lo que estoy tratando de hacer. ¡Gracias por su respuesta!
 – 
dannkis
27 nov. 2021 a las 13:05
2
Si pudiera compartir mis pensamientos, también señalaría el hecho de que tener variables estáticas globales de esta manera es muy peligroso. Podría terminar en una situación con muchos errores si no borra esas variables cuando se cierra el formulario.
 – 
Steve
27 nov. 2021 a las 13:11
Gracias, @Steve, por la advertencia, ¿podría ser más preciso, por favor? Yo uso esas variables estáticas sin ningún error, tal vez tenga un uso muy específico ...
 – 
Fredy
27 nov. 2021 a las 13:27
¿Y si cierra Frm2? La variable todavía está allí apuntando a una forma dispuesta. Si intenta usarlo nuevamente después de que se cierre el formulario (2), obtendrá un bloqueo. Por supuesto, no sé nada de su código actual y el contexto exacto, por lo que es solo una advertencia de bandera roja en mi cabeza.
 – 
Steve
27 nov. 2021 a las 13:59