C# ¿Cómo mantener los datos de una Lista al pasar a otro Formulario?

publicado por: Anonymous

Ya que me han encargado en la universidad trabajar con List antes de base de datos, ahora bien, tengo una clase llamada Alumno en la cual tengo una variable lista (List<Alumno> Alumnos;). Tengo un Windows Form el cual contiene un botón que lleva a una ventana en donde ingreso todos los datos de un alumno y los guardo en mi lista, puedo ingresar los alumnos que quiera, y consultarlos también, y me aparecen aquellos que he ingresado, pero eso eso solo cuando tengo aquella ventana abierta, si cierro aquella ventana los datos de la lista desaparecen (nota: no estoy terminando de ejecutar al aplicación sino que cambio de ventana) lo que quiero hacer ese: ir y volver de una ventana a otra sin que los datos de la lista desaparezcan.

Esto tengo en la clase Alumno:

class Alumno : Persona
{
    private Carrera miCarrera;
    private DateTime fIngreso;
    private  List<Alumno> misAlumnos;

    public Alumno()
    {
        misAlumnos = new List<Alumno>();
    }

    public Alumno(String id) : base(id) { }

    public Alumno(String id, String nombres, String aPaterno, String aMaterno, DateTime fNacimiento, Carrera miCarrera, DateTime fIngreso)
        : base(id, nombres, aPaterno, aMaterno, fNacimiento)
    {
        this.Id = id;
        this.Nombres = nombres;
        this.Apaterno = Apaterno;
        this.Amaterno = Amaterno;
        this.Fnacimiento = Fnacimiento;
        this.FIngreso = fIngreso;
        this.miCarrera = miCarrera;

    }

    public Carrera Carrera
    {
        get { return miCarrera; }
        set { miCarrera = value; }
    }

    public DateTime FIngreso
    {
        get { return fIngreso; }
        set { fIngreso = value; }
    }

    public List<Alumno> Alumnos {
        get { return misAlumnos; }
    }

    public void addAlumno(Alumno nuevoAlumno)
    {
       misAlumnos.Add(nuevoAlumno);
    }

    public String egresoEstimado()
    {
        String egreso = "";
        egreso = Convert.ToString(FIngreso.Year + miCarrera.AniosDuracion);
        return egreso;
    }

    public bool siExiste(String id)
    {
        bool existe = false;
        existe = misAlumnos.Exists(alu => alu.Id == id);
        return existe;
    }

    public int EncuentraIndex(String id)
    {
        int index = misAlumnos.FindIndex(alu => alu.Id == id);
        return index;
    }
}

y en la clase form tengo esto:

public partial class P_Alumno : Form
{
    Carrera c = new Carrera();
    Alumno a = new Alumno();

    public P_Alumno()
    {
        InitializeComponent();

        comboCarrera.DataSource = Carrera.Carreras;
        comboCarrera.DisplayMember = "Descripcion";
    }

    private Alumno alumnoNuevo() {
        String rut = txtRut.Text;
        String Nombre = txtNombres.Text;
        String apaterno = txtAP.Text;
        String amaterno = txtAM.Text;
        DateTime fn = calendarioNacimiento.Value;
        DateTime fi = calendarioIngreso.Value;
        Carrera carr = new Carrera("100","carreraCualquiera",120000,9);
        Alumno aluNuevo = new Alumno(rut,Nombre,apaterno,amaterno,fn,carr,fi);
        return aluNuevo;
    }

    public void blocDesbloc(bool bloc) {
            txtNombres.Enabled = bloc;
            txtAP.Enabled = bloc;
            txtAM.Enabled = bloc;
            calendarioNacimiento.Enabled = bloc;
            calendarioIngreso.Enabled = bloc;
            comboCarrera.Enabled = bloc;
            btn_ingresar.Enabled = bloc;
    }

    public void mostrarUno(String id)
    {
        int i = a.EncuentraIndex(id);
        txtNombres.Text = a.Alumnos[i].Nombres;
        txtAP.Text = a.Alumnos[i].Apaterno;
        txtAM.Text = a.Alumnos[i].Amaterno;
        calendarioIngreso.Value = a.Alumnos[i].FIngreso;
        calendarioNacimiento.Value = a.Alumnos[i].Fnacimiento;
        comboCarrera.Text = a.Alumnos[i].Carrera.Id;
    }

    public void limpiar() {
        DateTime fecha_actual = DateTime.Now;
        txtRut.Text = "";
        txtNombres.Text = "";
        txtAP.Text = "";
        txtAM.Text = "";
        calendarioNacimiento.Value = fecha_actual;
        calendarioIngreso.Value = fecha_actual;
        comboCarrera.Text = "";
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //lbl.Text = calendarioIngreso.Value.ToShortDateString();
        Alumno nuevo = alumnoNuevo();
        if (a.siExiste(nuevo.Id))
        {
            MessageBox.Show("Este alumno ya existe");
        }
        else {
            a.addAlumno(nuevo);
            MessageBox.Show("Alumno Ingresado");
            blocDesbloc(false);
            limpiar();
        }
    }

    private void btn_buscar_Click(object sender, EventArgs e)
    {
        if (a.siExiste(txtRut.Text))
        {
            mostrarUno(txtRut.Text);
            MessageBox.Show("Este alumno ya existe");
        }
        else {
            MessageBox.Show("Ingreso disponible");
            blocDesbloc(true);
        }
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
        Form1 a = new Form1();
        a.ShowDialog();
        this.Dispose();
    }
}

el otro form solo tiene esto

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

    private void Form1_Load(object sender, EventArgs e)
    {
    }

    private void button1_Click(object sender, EventArgs e)
    {
        P_Alumno a = new P_Alumno();// form ingreso alumno
        a.ShowDialog();
    }

solución

Si consideramos el formulario un objeto, las variables de clase desaparecen cuando ese objeto desaparece.

Una solución consiste en recurrir a una de las denostadas variables globales. Declara una variable global en un módulo (puede llamarse, por ejemplo, gList). Dale a esa variable el valor de la lista. Mientras no cierres esa aplicación o alteres su valor mediante una instrucción, esa variable mantendrá su valor y podrás leerlo.

Otra solución es añadir a tu formulario un evento que envíe el valor de la lista a algún sitio antes de cerrarse y colocar en tu aplicación otro objeto que responda a ese evento y reciba el valor de la lista.

Los miembros de la clase Form se enumeran en el siguiente enlace: clase Form Los eventos para la clase Form se enumeran en la siguiente lista: eventos para la clase Form

El evento FormClosing se produce antes de que el formulario se cierre: evento FormClosing

Si la ejecución de una aplicación termina cuando se cierran todas las ventanas, aunque un formulario se cierre, siempre habrá otro abierto y es posible guardar la lista en él. Añadir al formulario una propiedad que represente la lista y a la que puedan acceder otros formularios puede ser una buena idea.

Si hablamos de lo que pasará con los datos cuando termine la ejecución de la aplicación, hablamos de persistencia. Si queremos que esos datos sigan disponibles, tenemos que guardarlos en algún fichero. Puede ser en una base de datos o en otro tipo de fichero. JSON o XML son formatos de fichero muy extendidas y relativamente fáciles de manejar. Antiguamente se usaban mucho los CSV; pero JSON y XML son formatos más modernos.

Agradezco a la comunidad stackoverflow su apoyo a esta solución que no es necesariamente la mejor. ¡Me gusta mucho aprender de los demás!

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *