none
pasar datos de un datagridview a un List<> RRS feed

  • Pregunta

  • Buenas tardes amigos

    estoy trabajando con winform tengo mi datagridview el cual puede contener uno o varios datos los cuales paso a una List 

    cuando mi datagridview tiene un solo registro lo paso a mi list<> sin problema, pero cuando hay mas de tres registros al recorrer el datagridview guarda el primer registro en mi list<> cuando vuelve a recorrer el datagridview y obtiene el segundo registro lo pasa al list<> pero borra el dato anterior y me pone dos veces el mismo valor, alguien podria asesorarme gracias

    este es mi codigo que uso 

    List<Concepto> items = new List<Concepto>();
                    Concepto concepto = new Concepto();
                    foreach (DataGridViewRow dr in dgvProductos.Rows)
                    {
                        if ((bool)dr.Cells[6].Value == true)
                        {
                            foreach (DataRow item in dtp.Rows)
                            {
                                concepto.cantidad = item["Cantidad"].ToString();
                                concepto.unidad = "PZA";
                                concepto.descripcion = item["Descripcion"].ToString();
                                concepto.valorUnitario = item["ValorUnitario"].ToString();
                                concepto.importe = item["Importe"].ToString();
                                concepto.noIdentificacion = item["No_Ticket"].ToString();                            
                            }                          
                        }
                        items.Add(concepto);
                    }
    gracias a todos.

    martes, 16 de febrero de 2016 19:23

Respuestas

  • hola

    si recorres el datagridview de donde sale el datatable ? podrias ayudarte con linq

    List<Concepto> conceptos = dtp.Rows.Cast<DataGridViewRow>()
    									.Select(new Concepto(){
    										cantidad = item.Cells["Cantidad"].Value.ToString();
    										unidad = "PZA";
    										descripcion = item.Cells["Descripcion"].Value.ToString();
    										valorUnitario = item.Cells["ValorUnitario"].Value.ToString();
    										importe = item.Cells["Importe"].Value.ToString();
    										noIdentificacion = item.Cells["No_Ticket"].Value.ToString();   
    									}).ToList();

    tomas los datos directo de las celdas del grid

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP martes, 16 de febrero de 2016 19:35
    • Marcado como respuesta Enoc22 martes, 16 de febrero de 2016 22:01
    martes, 16 de febrero de 2016 19:35
  • El problema es que creas una única instancia del tipo Concepto.

    Lo que te esta pasando es:

    - creas una instancia de Concepto
    - lo cargas con los datos de la primera fila y lo añades a la lista
    - ese mismo objeto lo modificas con los datos de la segunda fila y lo añades a la lista

    En realidad lo que tienes es una lista de dos posiciones en la que los dos elementos  hacen referencia al mismo objeto: la instancia de Concepto que has creado y modificado con los datos de la segunda fila. Por eso son iguales: porque es el mismo objeto.

    Para cada fila deberías crear una instancia diferente:

    List<Concepto> items = new List<Concepto>();
                    foreach (DataGridViewRow dr in dgvProductos.Rows)
                    {
                        if ((bool)dr.Cells[6].Value == true)
                        {
                            Concepto concepto = new Concepto();
                            concepto.cantidad = Convert.ToString(dr.Cells["Cantidad"].Value);
                            concepto.unidad = "PZA";
                            concepto.descripcion = Convert.ToString(dr.Cells["Descripcion"].Value);
                            concepto.valorUnitario = Convert.ToString(dr.Cells["ValorUnitario"].Value);
                            concepto.importe = Convert.ToString(dr.Cells["Importe"].Value);
                            concepto.noIdentificacion = Convert.ToString(dr.Cells["No_Ticket"].Value);                               
    
                            items.Add(concepto);                        
                        }                    
                    }


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Propuesto como respuesta Sergio ParraModerator martes, 16 de febrero de 2016 20:58
    • Marcado como respuesta Enoc22 martes, 16 de febrero de 2016 22:02
    martes, 16 de febrero de 2016 20:25

Todas las respuestas

  • Hola:

     La instancia de Concepto y el Add a la lista deben de ir dentro del foreach

    List<Concepto> items = new List<Concepto>();
    foreach (DataGridViewRow dr in dgvProductos.Rows)
    {
        if ((bool)dr.Cells[6].Value == true)
        {
            foreach (DataRow item in dtp.Rows)
            {
    			Concepto concepto = new Concepto();
                concepto.cantidad = item["Cantidad"].ToString();
                concepto.unidad = "PZA";
                concepto.descripcion = item["Descripcion"].ToString();
                concepto.valorUnitario = item["ValorUnitario"].ToString();
                concepto.importe = item["Importe"].ToString();
                concepto.noIdentificacion = item["No_Ticket"].ToString();     
    			items.Add(concepto);
            }                          
        }
    }


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 16 de febrero de 2016 19:29
  • hola

    si recorres el datagridview de donde sale el datatable ? podrias ayudarte con linq

    List<Concepto> conceptos = dtp.Rows.Cast<DataGridViewRow>()
    									.Select(new Concepto(){
    										cantidad = item.Cells["Cantidad"].Value.ToString();
    										unidad = "PZA";
    										descripcion = item.Cells["Descripcion"].Value.ToString();
    										valorUnitario = item.Cells["ValorUnitario"].Value.ToString();
    										importe = item.Cells["Importe"].Value.ToString();
    										noIdentificacion = item.Cells["No_Ticket"].Value.ToString();   
    									}).ToList();

    tomas los datos directo de las celdas del grid

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP martes, 16 de febrero de 2016 19:35
    • Marcado como respuesta Enoc22 martes, 16 de febrero de 2016 22:01
    martes, 16 de febrero de 2016 19:35
  • Hola gracias por responder modifique el codigo, pero cuando hay mas de tres registros al recorrer el datagridview guarda el primer registro en mi list<> cuando vuelve a recorrer el datagridview y obtiene el segundo registro lo pasa al list<> pero borra el dato anterior y me pone dos veces el mismo valor

    List<Concepto> items = new List<Concepto>();
                    Concepto concepto = new Concepto();
                    foreach (DataGridViewRow dr in dgvProductos.Rows)
                    {
                        if ((bool)dr.Cells[6].Value == true)
                        {
                            concepto.cantidad = Convert.ToString(dr.Cells["Cantidad"].Value);
                            concepto.unidad = "PZA";
                            concepto.descripcion = Convert.ToString(dr.Cells["Descripcion"].Value);
                            concepto.valorUnitario = Convert.ToString(dr.Cells["ValorUnitario"].Value);
                            concepto.importe = Convert.ToString(dr.Cells["Importe"].Value);
                            concepto.noIdentificacion = Convert.ToString(dr.Cells["No_Ticket"].Value);                               
    
                            items.Add(concepto);                        
                        }                    
                    }

    martes, 16 de febrero de 2016 20:10
  • El problema es que la variable concepto la inicializas fuera del bucle. Debes hacer el "new" dentro del bucle. De lo contrario, al ser un tipo-referencia, todas las iteraciones añaden el mismo objeto a la lista (todas las entradas de la lista referencian el mismo objeto).

    martes, 16 de febrero de 2016 20:14
    Moderador
  • si, tienes razon leandro el datatable ahi esta de mas modifique el codigo tomando solo los valores de mi datagridview pero igual sigue imprimiendo los datos repetidos

    martes, 16 de febrero de 2016 20:15
  • El problema es que creas una única instancia del tipo Concepto.

    Lo que te esta pasando es:

    - creas una instancia de Concepto
    - lo cargas con los datos de la primera fila y lo añades a la lista
    - ese mismo objeto lo modificas con los datos de la segunda fila y lo añades a la lista

    En realidad lo que tienes es una lista de dos posiciones en la que los dos elementos  hacen referencia al mismo objeto: la instancia de Concepto que has creado y modificado con los datos de la segunda fila. Por eso son iguales: porque es el mismo objeto.

    Para cada fila deberías crear una instancia diferente:

    List<Concepto> items = new List<Concepto>();
                    foreach (DataGridViewRow dr in dgvProductos.Rows)
                    {
                        if ((bool)dr.Cells[6].Value == true)
                        {
                            Concepto concepto = new Concepto();
                            concepto.cantidad = Convert.ToString(dr.Cells["Cantidad"].Value);
                            concepto.unidad = "PZA";
                            concepto.descripcion = Convert.ToString(dr.Cells["Descripcion"].Value);
                            concepto.valorUnitario = Convert.ToString(dr.Cells["ValorUnitario"].Value);
                            concepto.importe = Convert.ToString(dr.Cells["Importe"].Value);
                            concepto.noIdentificacion = Convert.ToString(dr.Cells["No_Ticket"].Value);                               
    
                            items.Add(concepto);                        
                        }                    
                    }


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Propuesto como respuesta Sergio ParraModerator martes, 16 de febrero de 2016 20:58
    • Marcado como respuesta Enoc22 martes, 16 de febrero de 2016 22:02
    martes, 16 de febrero de 2016 20:25
  • >>tienes razon leandro el datatable ahi esta de mas modifique el codigo tomando solo los valores de mi datagridview pero igual sigue imprimiendo los datos repetidos

    me parecia, animate con linq el codigo va a quedar mucho mas prolijo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 16 de febrero de 2016 20:26
  • Gracias Asier ya pude resolver el problema  me ayudo mucho tu observacion.
    martes, 16 de febrero de 2016 22:03
  • El "item", ¿de dónde sale?
    martes, 7 de septiembre de 2021 9:28