none
Datgridview no muestra datos RRS feed

  • Pregunta

  • Hola resulta que tengo una appl windows en c# en la cual lleno un gridview con los datos de una lista generica de la siguiente manera.

     

    CompraDetalle compraDetalle = new CompraDetalle();

    compraDetalle.fltTotal =

    Convert.ToDouble(this.txtValorVenta.Text) * Convert.ToDouble(this.txtCantidad.Text);

    compraDetalle.fltValorCompra =

    Convert.ToDouble(this.txtValorCompra.Text);

    compraDetalle.fltValorVenta =

    Convert.ToDouble(this.txtValorVenta.Text);

    compraDetalle.intCantidad =

    Convert.ToInt32(this.txtCantidad.Text);

    compraDetalle.intCodCompra = 0;

    compraDetalle.strCodProducto =

    this.cboNombreProducto.SelectedValue.ToString();

    compraDetalle.strNomProducto =

    this.cboNombreProducto.Text;

     

    this.lstCompraDetalle.Add(compraDetalle);

     

    this.dgvDetalleCompras.AutoGenerateColumns = false;

     

    this.dgvDetalleCompras.DataSource = lstCompraDetalle;

    cuando se agrega el primer registro todo funciona muy bien, me agrega el registro a la lista y este se refleja en el datagridview. pero cuando intento agregar un segundo registro, este queda en la lista pero no se refleja en el datagridview.

    Alguien sabe por que me puede estar pasando esto?

    Mucha Gracias...

    andrestabares
    jueves, 23 de julio de 2009 3:06

Respuestas

  • "Andres Tabares" escribió:

    > cuando se agrega el primer registro todo funciona muy bien, me agrega
    > el registro a la lista y este se refleja en el datagridview. pero cuando
    > intento agregar un segundo registro, este queda en la lista pero no se
    > refleja en el datagridview.

    Hola, Andrés:

    No suelo enlazar una lista genérica List<T> a un control DataGridView, será porque estoy más acostumbrado a trabajar con objetos DataTable, pero salvo que yo esté equivocado, entiendo que cada vez que añadas un elemento a la lista, tienes que asignar de nuevo el valor de la propiedad DataSource del control:

         this.dgvDetalleCompras.DataSource = null;

         this.lstCompraDetalle.Add(compraDetalle);

         this.dgvDetalleCompras.DataSource = lstCompraDetalle;

    Se comprende que la variable objeto lstCompraDetalle está definida del tipo List<T>.

    Lo que no comprendo de tu código es la siguiente asignación que efectúas:

    >   this.dgvDetalleCompras.AutoGenerateColumns = false;

    Si indicas que no deseas que se generen automáticamente las columnas del control DataGridView, digo yo que las crearás manualmente.

    Me ha dado por realizar una prueba, y desde luego, he tenido que quitar dicha asignación para que me aparezcan las columnas de la lista genérica en el control DataGridView. :-)

    Un saludo



    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta Andres Tabares viernes, 24 de julio de 2009 2:59
    jueves, 23 de julio de 2009 13:37

Todas las respuestas

  • "Andres Tabares" escribió:

    > cuando se agrega el primer registro todo funciona muy bien, me agrega
    > el registro a la lista y este se refleja en el datagridview. pero cuando
    > intento agregar un segundo registro, este queda en la lista pero no se
    > refleja en el datagridview.

    Hola, Andrés:

    No suelo enlazar una lista genérica List<T> a un control DataGridView, será porque estoy más acostumbrado a trabajar con objetos DataTable, pero salvo que yo esté equivocado, entiendo que cada vez que añadas un elemento a la lista, tienes que asignar de nuevo el valor de la propiedad DataSource del control:

         this.dgvDetalleCompras.DataSource = null;

         this.lstCompraDetalle.Add(compraDetalle);

         this.dgvDetalleCompras.DataSource = lstCompraDetalle;

    Se comprende que la variable objeto lstCompraDetalle está definida del tipo List<T>.

    Lo que no comprendo de tu código es la siguiente asignación que efectúas:

    >   this.dgvDetalleCompras.AutoGenerateColumns = false;

    Si indicas que no deseas que se generen automáticamente las columnas del control DataGridView, digo yo que las crearás manualmente.

    Me ha dado por realizar una prueba, y desde luego, he tenido que quitar dicha asignación para que me aparezcan las columnas de la lista genérica en el control DataGridView. :-)

    Un saludo



    Enrique Martínez [MS MVP - VB]
    • Marcado como respuesta Andres Tabares viernes, 24 de julio de 2009 2:59
    jueves, 23 de julio de 2009 13:37
  • Si vas a trabajar con un control DataGridView enlazado a una lista genérica, lo mismo te resulta útil usar un objeto BindingList<T>, con el que podrás crear colecciones con enlaces de datos.

    Imagina que tienes estas dos clases:

     class Cliente
        {
            private int _idCliente;
            private string _nombre;

            public int IdCliente
            {
                set { _idCliente = value; }

                get { return _idCliente; }
            }

            public String Nombre
            {
                set { _nombre = value; }

                get { return _nombre; }
            }
      
        }

        class ListaClientes : System.ComponentModel.BindingList<Cliente>
        {
           private void NuevoCliente(object sender, System.ComponentModel.AddingNewEventArgs e)
            {
                Cliente c = new Cliente();
                e.NewObject = c;

            }
        }

    Enlazarías el control DataGridView con una instancia de la clase ListaClientes de la siguiente manera:

         ListaClientes lista = new ListaClientes();

         this.dataGridView1.DataSource = lista;

    Ahora, simplemente añadirías los registros directamente en el control DataGridView.

     

     


    Enrique Martínez [MS MVP - VB]
    jueves, 23 de julio de 2009 14:03