none
error al tratar de restar dos columnas en datagridview c# RRS feed

  • Pregunta

  • estoy teniendo problemas al tratar de restar dos columnas en un datagridview y luego mostrar ese resultado en otra columna, el error que me sale es "Referencia a objeto no establecida como instancia de un objeto"

    las columnas que quiero restar son, costo - pago y que se muestre en pendiente y en estatus me muestre en rojo que aun esta en proceso y si saldo me muestre en verde que esta pagado o concluido.

    aqui esta mi codigo

    private void dgvFactura_CellEndEdit(object sender, DataGridViewCellEventArgs e)
            {
            if (dgvFactura.Columns[e.ColumnIndex].Name == "Costo")
            {
             //cantidad = int.Parse(dgvFactura.Rows[e.RowIndex].Cells[0].Value.ToString());
             costo_procedimiento = int.Parse(dgvFactura.Rows[e.RowIndex].Cells[2].Value.ToString());
            pago_procedimiento = int.Parse(dgvFactura.Rows[e.RowIndex].Cells[3].Value.ToString());// aqui es donde me muestra el error 
            pendiente_procedimiento = costo_procedimiento - pago_procedimiento;
            dgvFactura.Rows[e.RowIndex].Cells[4].Value = pendiente_procedimiento;
    
    
                }
    
            }
    esta es la imagen del datagridview 

    lunes, 21 de octubre de 2019 11:54

Todas las respuestas

  • Hola hb06, el tema que usas CellFormatting y cuando crea el DGV le estas pidiendo que reste una columna que aún no ha creado en todo caso efecuta el pedido cuando la columna sea "Estatus" entonces todas las columnas estarán formadas

    Prueba y comenta

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗

    lunes, 21 de octubre de 2019 12:40
  • Saludos, gracias por tu respuesta, pero me gustaria si puedes presentar un ejemplo de eso que me comentas.? para poder aplicarlo,

    gracias. 

    lunes, 21 de octubre de 2019 14:20
  • Simplemente coloca tu código tal cual solo cambia "Costo" por "Estatus", CellFormating acuta cada vez que se forma una celda, tu estás pidiendo que reste un valor de una celda que aún no fue creada. Por otro lado verifica si los valore que se ingresan no sean nulos, si no te dará error en la resta.

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗

    lunes, 21 de octubre de 2019 14:26
  • probare lo que me comentas, ahora bien cuando cuando ejecuto este formulario, en la primera columna de pago puedo ingresar bien los datos, pero cuando paso a pago ahi me presenta el error que está en el código, "Referencia a objeto no establecida como instancia de un objeto" y si comento esta linea 
     // pago_procedimiento = int.Parse(dgvFactura.Rows[e.RowIndex].Cells[3].Value.ToString())
    puedo ingresar bien los datos, pero me pasa los valores iguales, es decir costo 200 y en pendiente 200.
    lunes, 21 de octubre de 2019 14:35
  • Bueno por un lado quita los Tostring()  y convierte mediante Convert.ToInt32(DgvFacturas.Rows[e.RowIndex].Cells [3].Value)  usa esto en todas las conversiones

    Debería funcionar adecaudamente. Ten en cuenta la base 0 de los rows y también que aplicas mediate Name de la columna y no por su Header Text


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗


    lunes, 21 de octubre de 2019 15:46
  • Pude resolver con lo que me comentaste, gracias, otra cosa aun no me sale el texto que le asigne en el estatus, mira el codigo a ver que estoy haciendo mal. quiero que si el cliente hace un abono, presente el estatus en proceso, y si saldo que muestre terminado.

    if (dgvFactura.Columns[e.ColumnIndex].Name == "Estatus")
                {
                   
                    costo_procedimiento = Convert.ToInt32(dgvFactura.Rows[e.RowIndex].Cells[2].Value);
                    pago_procedimiento = Convert.ToInt32(dgvFactura.Rows[e.RowIndex].Cells[3].Value);
                    pendiente_procedimiento = costo_procedimiento - pago_procedimiento;
                    dgvFactura.Rows[e.RowIndex].Cells[4].Value = pendiente_procedimiento;
    		
    	        	if (Convert.ToInt32(e.Value) <= costo_procedimiento)
                    {
                        e.CellStyle.ForeColor = Color.White;
                        e.CellStyle.BackColor = Color.Red;
                        e.CellStyle.Format = "En proceso";
    
    
                    }
    		        else
                    {
                        e.CellStyle.ForeColor = Color.White;
                        e.CellStyle.BackColor = Color.Green;
                        e.CellStyle.Format = "Terminado";
                    }
    
    
                }

    lunes, 21 de octubre de 2019 17:59
  • Quedaría así para esa parte del código

     
      if (pendiente_procedimiento <= 0 )
                    {
                        DGV[5, e.RowIndex].Style.ForeColor = Color.White;
                        DGV[5, e.RowIndex].Style.BackColor = Color.Green;
                        DGV[5, e.RowIndex].Value = "Terminado";
    
    
                    }
                    else
                    {
                        DGV[5, e.RowIndex].Style.ForeColor = Color.White;
                        DGV[5, e.RowIndex].Style.BackColor = Color.Red;
                        DGV[5, e.RowIndex].Value = "En proceso";
                    
                    }

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗

    lunes, 21 de octubre de 2019 18:36