entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Indicar formulario destino a otro formulario.

Buenas,

Estoy haciendo una aplicacion de registro de inasistencia de personal y me surgió el problema que necesito indicarle a un formulario, en donde se lista cierta entidad, el siguiente formulario que se debe abrir despues de haberla sido elegida.
Mi duda es, mas que nada, de implementación ya que tengo idea de como aplicarla.
Tengo la posibilidad de usar un enumerado para indicar que el siguiente formulario o pasar el tipo de formulario o la instancia del formulario por constructor. Capaz exista otra manera mas elegante de hacerlo pero la desconozco.

Para orientarlos un poco mas, flujo de trabajo seria el siguiente:

frmPrincipal.cs:
Es la pantalla principal para arrancar y tiene esta 2 opciones.

private void tsmiDatosPersonal_Click(object sender, EventArgs e)
{
    frmPersonalListado frm = new frmPersonalListado();
    frm.ShowDialog(this);
}

private void tsmiInasistenciasPersonal_Click(object sender, EventArgs e)
{
    frmPersonalListado frm = new frmPersonalListado();
    frm.ShowDialog(this);
}

frmPersonalListado.cs
Es donde se listan el personal del establecimiento y luego selecciono uno de la lista y abre el siguiente formulario.

public frmPersonalListado()
{
    InitializeComponent();
    _personalNegocio = new PersonalNegocio();
    _inasistenciaNegocio = new Lazy<InasistenciaNegocio>();
}

public frmPersonalListado(Form formularioObjetivo) 
    : this()
{
    _formularioObjetivo = formularioObjetivo;
}

private void tsbVerPersonal_Click(object sender, EventArgs e)
{
    Aplicacion.Entidades.Personal personalSeleccionado = lvPersonal.SelectedItems[0].Tag as Aplicacion.Entidades.Personal;
    frmPersonalCRUD frm = new frmPersonalCRUD(ModoFormulario.Ver, personalSeleccionado); // <<< Aca deberia instanciar el formulario correcto elegido desde el menú.
    frm.ShowDialog(this);
}

Si necesitan revisar el código fuente, les dejo el repositorio en github: Repositorio
Van a poder encontrar los formularios en la carpeta EscuelaSimple.

ACTUALIZACIÓN:
Modifique el la pregunta con el código de interés. Mi duda mas que nada es si hay alguna manera de hacerle saber al formulario que llamo, que formulario tiene que instanciar una vez que selecciono un ítem de la lista.

0voto

carlossevi comentado

Me pierdo un poco con todo el código de tu respositorio ¿Qué te parece que pongamos un ejemplo y centremos el tiro? Dinos en qué parte de tu código llamas al formulario, porque no termino de entender el problema.

Yo entiendo que tienes una serie de formularios que deben ser llamados en un orden específico, ¿qué te impide hacer lo siguiente?

// Mostrar los formularios de 1 en 1:
Form form1 = new FormularioTipo1();
form1.ShowDialog();
Form form2 = new FormularioTipo2();
form2.ShowDialog();
Form form3 = new FormularioTipo3();
form3.ShowDialog();
...

0voto

bl4z3r comentado

@carlossevi La idea no es instanciar los formulario en serie, si no, indicarle al formulario cual es el siguiente formulario que tiene que abrir.

0voto

carlossevi comentado

Puedes pasarle el siguiente formulario como parámetro en la creación del objeto o incluso utilizar algún método definido en la clase antes de mostrarlo, pero eso haría que el formulario 2 se muestre sobre el 1 y no a continuación. La diferencia no es grande, pero existe ¿es eso lo que quieres? ¿cuál es la ventaja?

0voto

bl4z3r comentado

@carlossevi La idea es que se siga el flujo de trabajo. No importa si hay 5 formularios abierto. Yo quiero saber, ademas, si es correcto instanciar el formulario y que consuma los recursos innecesarios antes de haber seleccionado un ítem de la lista. Pensé en la inyectar el formulario siguiente instanciado a través del constructor pero me di cuenta que se necesita que ese mismo formulario necesita la entidad seleccionada para instanciarse.

Posiblemente tenga inyectarle el comportamiento con un Action<T> a través del constructor.

Justamente es una duda de implementación la que tengo y no una duda de lógica.

0voto

carlossevi comentado

Por no darte una respuesta sin comprobarlo, mañana hago algunas pruebas y te comento opciones que se me ocurran.

1 Respuesta

1voto

carlossevi Puntos63520

La verdad es que yo creo que no lo hubiera hecho de esta forma porque me parece más limpio cómo queda abriendo y cerrando los formularios consecutivamente en lugar de abrirlos unos dentro de otros, pero te pongo cómo quedaría con las pruebas que he hecho:

Formulario Principal, Form1:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        FormB miFormB = new FormB();
        FormA miFormA = new FormA(miFormB);
        miFormA.ShowDialog();
    }
}

Formulario A, el que llama a otro indeterminado:

public partial class FormA : Form
{
    Form FormularioSiguiente;

    public FormA(Form FormSiguiente)
    {
        InitializeComponent();
        FormularioSiguiente = FormSiguiente;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        FormularioSiguiente.ShowDialog();

    }
}

El formulario B en este ejemplo no tiene nada de especial.

0voto

bl4z3r comentado

@carlossevi tengo un problema de performance de la manera en que lo planteas. A la hora de instanciar el formulario destino, en el constructor, se instancia la clase negocio del formulario respectivo que cargas otras cosas con respecto a la comunicación contra la base de datos y, por ello, se obtiene una mala experiencia de usuario por que tardar en cargar el formulario. ¿Hay otro forma de hacer esto?

0voto

carlossevi comentado

No le veo ningún sentido a lo que comentas. De una u otra forma el objeto sólo se construye una vez, por lo que el problema de rendimiento lo tendrás igual tanto si lo construyes por adelantado como no.

Supongo que debes revisar los constructores y ver si es necesario cargas tantas cosas y consultar tanto la base de datos en la construcción de un formulario.

Parece un problema de diseño.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta