none
Pasar una lista de un formulario a otro RRS feed

  • Pregunta

  • Tengo dos formularios y una clase, en el formulario 1 al apretar un radiobutton se me abre un formulario2 con showdialog, pero este formulario1 permanece abierto, mientras que en el formulario2 es en donde ingreso valores los cuales los tengo en una clase:

    class ListaRetencionGuardado
        {        
            private string numeroretencion;      
            private string tipocomprobante;
            private string numerotipocomprobante;
            private string ejerciciofiscal;
            private string baseimponible;
            private string tipoimpuesto;
            private string porcetanjeretencion;
            private string valorretenido;
            private string estado;
           
            public string Numeroretencion
            {
                get { return numeroretencion; }
                set { numeroretencion = value; }
            }       
            public string Tipocomprobante
            {
                get { return tipocomprobante; }
                set { tipocomprobante = value; }
            }
            public string Numerotipocomprobante
            {
                get { return numerotipocomprobante; }
                set { numerotipocomprobante = value; }
            }
            public string Ejerciciofiscal
            {
                get { return ejerciciofiscal; }
                set { ejerciciofiscal = value; }
            }
            public string Baseimponible
            {
                get { return baseimponible; }
                set { baseimponible = value; }
            }
            public string Tipoimpuesto
            {
                get { return tipoimpuesto; }
                set { tipoimpuesto = value; }
            }
            public string Porcetanjeretencion
            {
                get { return porcetanjeretencion; }
                set { porcetanjeretencion = value; }
            }
            public string Valorretenido
            {
                get { return valorretenido; }
                set { valorretenido = value; }
            }
            public string Estado
            {
                get { return estado; }
                set { estado = value; }
            }
    
            public ListaRetencionGuardado()
            {
    
            }


    En el formulario 2 al apretar un boton accedo a mi clase y lleno la lista asi:

    private List<ListaRetencionGuardado> GuardarDetalleRetencion()
            {
                List<ListaRetencionGuardado> listaretencion = null;
                ListaRetencionGuardado clasere = new ListaRetencionGuardado();
                listaretencion = new List<ListaRetencionGuardado>();
                foreach (DataGridViewRow filas in dgvRetencion.Rows)
                {
                    clasere.Numeroretencion = txtNumeroSerie1Comprobante.Text + txtNumeroSerie2Comprobante.Text + txtNumeroSecuencialComprobante.Text;
                    clasere.Tipocomprobante = filas.Cells["Comprobante"].Value.ToString();
                    clasere.Numerotipocomprobante = filas.Cells["NumeroComprobante"].Value.ToString();
                    clasere.Ejerciciofiscal = filas.Cells["EjercicioFiscal"].Value.ToString();
                    clasere.Baseimponible = filas.Cells["BaseImponible"].Value.ToString();
                    clasere.Tipoimpuesto = filas.Cells["Impuesto"].Value.ToString();
                    clasere.Porcetanjeretencion = filas.Cells["PorcentajeRetencion"].Value.ToString();
                    clasere.Valorretenido = filas.Cells["ValorRetenido"].Value.ToString();
    
    
                    listaretencion.Add(clasere);          
                    
                }
    
                return listaretencion;
            }

    Al apretar el boton se cierra el formulario, quedando solo abierto el formulario 1, y al apretar el boton del formulario 1 para obtener la lista,el count de la lista (porque hago un count para ver si tengo los datos) me sale igual a  0.

    En el boton del formulario 1 intento acceder a la lista para obtener cada elemento de ella asi:

    private void btnGuardarFact_Click(object sender, EventArgs e)
    {
    List<ListaRetencionGuardado> listare = new List<ListaRetencionGuardado>();
    
      foreach(var dato in listare)
      {
         dato.ElementAt(1);
      }
    }

    Pero la lista me sale vacia, por lo tanto nunca entra al foreach, alguna ayuda?

    sábado, 11 de julio de 2020 22:52

Respuestas

  • Ya caí. El objeto que creas, clasere, es el mismo, por eso te quedan todos como el último. Lo que tendrías que hacer es, dentro del loop, crear una nueva instancia de clasere, asignarle los datos, y añadirlo a la lista, NO instanciarlo antes del loop y dentro del mismo cambiar sus propiedades. 
    • Marcado como respuesta NathalyChR domingo, 12 de julio de 2020 18:36
    domingo, 12 de julio de 2020 3:18
  • No, Nathaly, la lista la tenes que tener en el Form 1 como miembro público de la clase Form 1, independientemente que esa lista sea de otra clase. En el Form 2 tenes la referencia al Form 1 y así cargas la lista. Luego en el Form 1 ya la tenes cargada y la podes usar porque es miembro de la clase Form 1. 

    Por favor, lee un poco más despacio mi respuesta anterior, que lo explique todo y con detalle. Que a veces uno/a lee medio rápido.

    • Marcado como respuesta NathalyChR domingo, 12 de julio de 2020 18:36
    domingo, 12 de julio de 2020 1:15

Todas las respuestas

  • Hola Nathaly

    Lo que podes hacer es 1° declarar la variable de la lista como miembro público del Form 1, y luego, desde el Form 2 (el hijo), acceder a una referencia al Form 1 (el padre). Así, podrás cargar la lista en el Form 2, y tenerla en el Form 1.

    Cómo se hace?

    1° Al llamar a ShowDialog() del Form 2 (el hijo) en el Form 1, le pasas como parámetro this, que es una autoreferencia a si mismo, a Form 1 (el padre).

    form2.ShowDialog(this);

    2° En donde necesitas acceder a Form1, en cualquier método de Form 2:

    Form1 padre = (Form1)this.Owner;  // en la Propiedad Owner de Form 2 pusimos la referencia a Form 1

    3° Luego, para acceder al miembro público (la lista) de Form 1:

    padre.listare = GuardarDetalleRetencion();

    Saludos

    Pablo

    domingo, 12 de julio de 2020 0:38
  • Creo que la pagina tiene un error he tratado de comentar 2 veces y no me envia. bueno

    Gracias por responder, no entendi muy bien lo que quisiste decir, desde mi form 1 (que queda abierto al llamar al otro) llamo a mi form 2, en este lleno una lista que se encuentra en una clase aparte, no esta en el mismo formulario 2, como muestro en la pregunta, al apretar un boton esta lista se llena y se cierra el formulario, lo que intento es acceder a esa lista desde mi formulario 1, para poder acceder a cada elemento guardado y asi guardarlo en la base de datos, pero cuando intento recorerlo con el foreach nunca me entra porque la lista esta vacia
    domingo, 12 de julio de 2020 0:59
  • No, Nathaly, la lista la tenes que tener en el Form 1 como miembro público de la clase Form 1, independientemente que esa lista sea de otra clase. En el Form 2 tenes la referencia al Form 1 y así cargas la lista. Luego en el Form 1 ya la tenes cargada y la podes usar porque es miembro de la clase Form 1. 

    Por favor, lee un poco más despacio mi respuesta anterior, que lo explique todo y con detalle. Que a veces uno/a lee medio rápido.

    • Marcado como respuesta NathalyChR domingo, 12 de julio de 2020 18:36
    domingo, 12 de julio de 2020 1:15
  • La lista que creas (e intentas guardar) (en tu ejemplo), en el Form 1, es obvio que estará vacía, porque es una lista del Form 1 (de tu ejemplo) que recién la creas y no le agregaste ningún elemento, NO es la lista que creaste y cargaste en el Form 2 (de tu ejemplo), que se destruyó al destruirse la instancia del Form 2. 

    domingo, 12 de julio de 2020 1:26
  • Gracias no pude utilizar el Owner por como tengo mi formulario, pero si instancie desde mi form 1 la lista y ya no me regresa vació, era eso :). Pero ahora que cuando intento recorrer la lista

    foreach (ListaRetencionGuardado datos in ListaDetalle)
     {
        var septimo = datos.Baseimponible;
           MessageBox.Show(septimo);
     }

    Me repite siempre el ultimo valor,  si inserto un 12,13,14, me devuelve 3 veces el 14. Como puedo recorrer la lista para acceder a cada elemento y estos guardarlos en variables?

    domingo, 12 de julio de 2020 2:44
  • Si no podes usar el Owner (o sea pasarle this a ShowDialog() de Form 1) entonces no vas a tener visible la lista en el Form 2, entonces siempre estará vacía (y en el Form 1, que eso si está bien). Por qué no podes? Aunque hay otras posibilidades de pasar la referencia de Form 1 a Form 2.

    De lo 2°, entre que, dado lo anterior que te digo, y que tendría que ver otras partes del código para saber que ocurre, no se. Pero nunca podes tener una lista llena si se llena en un lugar donde no es accesible.  

     
    domingo, 12 de julio de 2020 2:59
  • Mi form esta dentro de un panel y no me deja acceder a la propiedad Owner, pero creo que no me explique bien, ya me pasa la lista, cuando hago el count ya me muestra la cantidad de valores que ingrese, no necesite el this, ya que por tener el form dentro de un panel me daba un error. Solo coloque la lista en public como me habias dicho desde el formulario 1 y le pase el GuardarDetalleRetencion(), como esta en tu ejemplo.

    Pero ahora que ya puedo tener la cantidad de datos, al recorrerlo solo me repite siempre el ultimo valor. La clase y como lleno a esta, estan ahi arriba en la pregunta original. No se si lleno mal la lista
    domingo, 12 de julio de 2020 3:05
  • Ya caí. El objeto que creas, clasere, es el mismo, por eso te quedan todos como el último. Lo que tendrías que hacer es, dentro del loop, crear una nueva instancia de clasere, asignarle los datos, y añadirlo a la lista, NO instanciarlo antes del loop y dentro del mismo cambiar sus propiedades. 
    • Marcado como respuesta NathalyChR domingo, 12 de julio de 2020 18:36
    domingo, 12 de julio de 2020 3:18
  • Gracias! pude solucionarlo tenias razon, cree la instancia dentro del loop y ya me devuelve todas las filas :), ambos consejos me ayudaron jeje, ya se me estaba partiendo la cabeza ayer :D gracias
    domingo, 12 de julio de 2020 18:35
  • Hola NathalyChR,

     

    gracias por confirmar que encontraste una respuesta a tu pregunta.

     

    Saludos cordiales

     

    Gabriel Castro

    lunes, 13 de julio de 2020 12:21
    Moderador