none
multiplicar una celda en un datgridview c# RRS feed

  • Pregunta

  • como multiplico dos celdas, cantidad y precio al momento de cambiar el valor el datagridview

    EJ

    CANTIDAD          PRECIO        TOTAL

         2                      4                8


    • Editado Berroa0731 domingo, 10 de junio de 2018 20:14
    domingo, 10 de junio de 2018 20:13

Respuestas

  • Una vez más, vinculación a datos puede responderle su pregunta.

    Una grilla (DataGridView) puede vincularse a una colección de objetos.  Cada objeto representa una fila en la grilla, y cada propiedad pública del objeto sería una celda (o columna).0

    Entonces si yo tengo la siguiente clase:

    public class RubroFactura
    {
       //Descripción del artículo a vender.
        public string Descripcion { get; set; }
        //Cantidad a vender.
        public double Cantidad { get; set; }
        //Precio unitario del artículo.
        public decimal PrecioUnitario { get; set; }
        //Precio total del rubro.  Es una propiedad calculada.
        public decimal Precio
        {
            get { return (decimal)Cantidad * PrecioUnitario; }
        }
    }

    Entonces puedo tener un DGV con las columnas Descripcion, Cantidad, Precio y Precio Total.  La vinculación la podría hacer en el evento Load del formulario.  Normalmente yo declaro una propiedad a nivel de formulario que mantiene una referencia a la colección de datos que vinculo al DGV.

    public class Form1 : Form
    {
        //Esta es mi colección de datos.
        public BindingList<RubroFactura> DetalleFactura { get; private set; }
        //Y la llenaría, tal vez, en el Form_Load si es que estuviera leyendo de, tal vez, una base de datos.
        //Si no, solamente la asigno como fuente de datos en caso de facturas nuevas.
        private void Form_Load(object sender, EventArgs e)
        {
            DetalleFactura = new BindingList<rubrofactura>();
            dgv1.AutoGenerateColumns = false;
            dgv1.DataSource = DetalleFactura;
        }
    }</rubrofactura>

    Para que eso funcione bien (eso de asignar una colección vacía como fuente de datos), hay que crear las colunnas del DGV a priori, ya sea escribiendo código que agrega columnas a la colección Columns del DGV, o bien en tiempo de diseño usando el diseñador de Visual Studio.  Lo importante a recordar es que debemos llenar siempre la propiedad DataPropertyName de la columna.  ¿Qué valor se pone ahí?  El nombre de la propiedad.  Para la columna de Precio Total, por ejemplo, el valor sería Precio; para la columna Precio Unitario, el valor sería PrecioUnitaro.  En fin, el nombre de la propiedad a la que corresponde.  Nótese cómo le decimos a la grilla que no debe generar columnas automáticamente.  En la mayoría de los casos eso es lo que queremos:  Evitar la generación de columnas y definir las columnas en tiempo de diseño.

    Notará, sin embargo, que la columna de Precio Total no actualiza cuando se meten nuevos valores.  ¿Qué pasó?  Hay un detalle importantísimo:  La vinculación a datos necesita de objetos que sean capaces de notificar a quien lo desee saber cuándo cambia el valor de una propiedad.  En términos de código eso quiere decir que el objeto vinculado a la grilla debe implementar la interfaz INotifyPropertyChanged.  Es fácil de hacer y si ve mis repositorios GIT (en mi firma está el enlace), encontrará el proyecto llamado wj.DataBinding.  Este proyecto le provee una clase base llamada NotifyPropertyChanged (sin la I al inicio) que le ayuda a escribir su clase.

    Usando wj.DataBinding, la clase RubroFactura la reescribimos así:

    public class RubroFactura : NotifyPropertyChanged
    {
        //Descripción del artículo a vender.
        private string m_descripcion;
        public string Descripcion
        {
            get { return m_descripcion; }
            set { SaveAndNotify(ref m_descripcion, value); }
        }
    
        //Cantidad a vender.
        private double m_cantidad;
        public double Cantidad
        {
            get { return m_cantidad; }
            set
            {
                bool cambio = SaveAndNotify(ref m_cantidad, value);
                if (cambio)
                {
                    //También informamos que Precio cambió.
                    RaisePropertyChanged("Precio");
                }
            }
        }
    
        //Precio unitario del artículo.
        private decimal m_precioUnitario;
        public decimal PrecioUnitario
        {
            get { return m_precioUnitario; }
            set
            {
                bool cambio = SaveAndNotify(ref m_precioUnitario, value);
                if (cambio)
                {
                    //También informamos que Precio cambió.
                    RaisePropertyChanged("Precio");
                }
            }
        }
    
        //Precio total del rubro.  Es una propiedad calculada.
        public decimal Precio
        {
            get { return (decimal)Cantidad * PrecioUnitario; }
        }
    }

    Ahora sí, con esta nueva versión, el precio total se calculará instantáneamente conforme escriba nuevos valores en la grilla.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT


    domingo, 10 de junio de 2018 21:32
    Moderador

Todas las respuestas

  • Una vez más, vinculación a datos puede responderle su pregunta.

    Una grilla (DataGridView) puede vincularse a una colección de objetos.  Cada objeto representa una fila en la grilla, y cada propiedad pública del objeto sería una celda (o columna).0

    Entonces si yo tengo la siguiente clase:

    public class RubroFactura
    {
       //Descripción del artículo a vender.
        public string Descripcion { get; set; }
        //Cantidad a vender.
        public double Cantidad { get; set; }
        //Precio unitario del artículo.
        public decimal PrecioUnitario { get; set; }
        //Precio total del rubro.  Es una propiedad calculada.
        public decimal Precio
        {
            get { return (decimal)Cantidad * PrecioUnitario; }
        }
    }

    Entonces puedo tener un DGV con las columnas Descripcion, Cantidad, Precio y Precio Total.  La vinculación la podría hacer en el evento Load del formulario.  Normalmente yo declaro una propiedad a nivel de formulario que mantiene una referencia a la colección de datos que vinculo al DGV.

    public class Form1 : Form
    {
        //Esta es mi colección de datos.
        public BindingList<RubroFactura> DetalleFactura { get; private set; }
        //Y la llenaría, tal vez, en el Form_Load si es que estuviera leyendo de, tal vez, una base de datos.
        //Si no, solamente la asigno como fuente de datos en caso de facturas nuevas.
        private void Form_Load(object sender, EventArgs e)
        {
            DetalleFactura = new BindingList<rubrofactura>();
            dgv1.AutoGenerateColumns = false;
            dgv1.DataSource = DetalleFactura;
        }
    }</rubrofactura>

    Para que eso funcione bien (eso de asignar una colección vacía como fuente de datos), hay que crear las colunnas del DGV a priori, ya sea escribiendo código que agrega columnas a la colección Columns del DGV, o bien en tiempo de diseño usando el diseñador de Visual Studio.  Lo importante a recordar es que debemos llenar siempre la propiedad DataPropertyName de la columna.  ¿Qué valor se pone ahí?  El nombre de la propiedad.  Para la columna de Precio Total, por ejemplo, el valor sería Precio; para la columna Precio Unitario, el valor sería PrecioUnitaro.  En fin, el nombre de la propiedad a la que corresponde.  Nótese cómo le decimos a la grilla que no debe generar columnas automáticamente.  En la mayoría de los casos eso es lo que queremos:  Evitar la generación de columnas y definir las columnas en tiempo de diseño.

    Notará, sin embargo, que la columna de Precio Total no actualiza cuando se meten nuevos valores.  ¿Qué pasó?  Hay un detalle importantísimo:  La vinculación a datos necesita de objetos que sean capaces de notificar a quien lo desee saber cuándo cambia el valor de una propiedad.  En términos de código eso quiere decir que el objeto vinculado a la grilla debe implementar la interfaz INotifyPropertyChanged.  Es fácil de hacer y si ve mis repositorios GIT (en mi firma está el enlace), encontrará el proyecto llamado wj.DataBinding.  Este proyecto le provee una clase base llamada NotifyPropertyChanged (sin la I al inicio) que le ayuda a escribir su clase.

    Usando wj.DataBinding, la clase RubroFactura la reescribimos así:

    public class RubroFactura : NotifyPropertyChanged
    {
        //Descripción del artículo a vender.
        private string m_descripcion;
        public string Descripcion
        {
            get { return m_descripcion; }
            set { SaveAndNotify(ref m_descripcion, value); }
        }
    
        //Cantidad a vender.
        private double m_cantidad;
        public double Cantidad
        {
            get { return m_cantidad; }
            set
            {
                bool cambio = SaveAndNotify(ref m_cantidad, value);
                if (cambio)
                {
                    //También informamos que Precio cambió.
                    RaisePropertyChanged("Precio");
                }
            }
        }
    
        //Precio unitario del artículo.
        private decimal m_precioUnitario;
        public decimal PrecioUnitario
        {
            get { return m_precioUnitario; }
            set
            {
                bool cambio = SaveAndNotify(ref m_precioUnitario, value);
                if (cambio)
                {
                    //También informamos que Precio cambió.
                    RaisePropertyChanged("Precio");
                }
            }
        }
    
        //Precio total del rubro.  Es una propiedad calculada.
        public decimal Precio
        {
            get { return (decimal)Cantidad * PrecioUnitario; }
        }
    }

    Ahora sí, con esta nueva versión, el precio total se calculará instantáneamente conforme escriba nuevos valores en la grilla.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT


    domingo, 10 de junio de 2018 21:32
    Moderador
  • GRACIAS EXCELENTE.....
    domingo, 10 de junio de 2018 21:55