• Viernes 3 de Mayo de 2024, 20:22

Autor Tema:  sumar y restar celdas de un DataGridview  (Leído 9878 veces)

lugarda

  • Miembro activo
  • **
  • Mensajes: 52
  • Nacionalidad: co
    • Ver Perfil
sumar y restar celdas de un DataGridview
« en: Jueves 1 de Julio de 2010, 21:22 »
0
Hola todos, tengo este caso:
1. Un datagridview con tres columnas Factura, saldo y una tercer columna Estado que es del tipo DataGridViewTextBoxColumn.
2. Tambien tengo un textbox para deplegar la suma de la columna saldo pero solo de las filas cuya celda Estado tenga el check.

El problema que tengo es que al quitar el check, vuelve y suma el dato de la celda Saldo en vez de restarlo.
Alguien tiene alguna idea de como logro que reste el valor en el textbox si le quito el check a la celda estado=
Gracias por la ayuda
Código: C#
  1.  
  2.  
  3.  double sumatoria = 0;
  4.          private void sumaSaldosFactura()
  5.         {
  6.             foreach (DataGridViewRow row in dataGridView1.Rows)
  7.             {
  8.                 bool chequeo=Convert.ToBoolean(row.Cells[5].Selected);
  9.                 if (chequeo)
  10.                 {
  11.                     sumatoria += sumatoria + Convert.ToDouble(row.Cells[4].Value);
  12.                 }
  13.                
  14.             }
  15.             tbSumatoria.Text = Convert.ToString(sumatoria);    //aqui se graba el total
  16.             tbSumatoria.Text = (double.Parse(tbSumatoria.Text)).ToString("#,#.00");
  17.            
  18.         }
  19.  
  20.         private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
  21.         {
  22.              sumaSaldosFactura();
  23.         }
  24.  
  25.  

gerloxxx

  • Miembro MUY activo
  • ***
  • Mensajes: 121
    • Ver Perfil
Re: sumar y restar celdas de un DataGridview
« Respuesta #1 en: Viernes 2 de Julio de 2010, 20:09 »
0
Hola,
1.- cada vez que se activa el un checkbox haces la sumatoria de todos los que estan activados, por lo que no necesitas restar, solo que no uses la variable sumatoria como una global, o inicializala a cero antes de cada sumatoria.

2.- Para conocer si la celda se encuentra activada, usa la propiedad "value" que al igual que las otras celdas es la que guarda la información, en este caso el valor booleano

3.- Lo mejor sería preguntar si el clic se hizo sobre esa celda para hacer el ciclo unicamente cuando activas un checkbox y no cuando das clic en otras celdas; pregunta por "e.ColumnIndex"

4.- la forma de hacer tu sumatoria no se si es realmente lo que quieres ya que vuelves a sumar lo que ya tenias a lo que viene

Código: C#
  1.  
  2.         {
  3.             double sumatoria = 0;
  4.             foreach (DataGridViewRow row in dataGridView1.Rows)
  5.             {
  6.                 bool chequeo = Convert.ToBoolean(row.Cells[5].Value );  //2.-
  7.                 if (chequeo)
  8.                 {
  9.                     sumatoria += Convert.ToDouble(row.Cells[4].Value); //4.-
  10.                 }
  11.  
  12.             }
  13.             tbSumatoria.Text = Convert.ToString(sumatoria);    //aqui se graba el total
  14.             tbSumatoria.Text = (double.Parse(tbSumatoria.Text)).ToString("#,#.00");
  15.         }
  16.  
  17.  

5.- lo que le falta a este codigo es que el evento ocurre antes de que cambie el valor de la celda, por lo que no hara la suma de la ultima celda activada, para solucionar eso te dejo este link:

http:\geeks.msblogsfernandezjaarchive2008715datagridviewcheckboxcolumn-detectar-el-cambio-check-en-el-evento-cellvaluechanged.aspx

saludos

lugarda

  • Miembro activo
  • **
  • Mensajes: 52
  • Nacionalidad: co
    • Ver Perfil
Re: sumar y restar celdas de un DataGridview
« Respuesta #2 en: Sábado 3 de Julio de 2010, 00:47 »
0
gerlo gracias por tu sugerencia, me sirvieron tu sugerencia, solo adicioné un evento mas que es el CurrentCellDirtyStateChanged para que se "asiente" por decirlo de alguna forma, el valor del check, antes que suceda el evento que me dispara la suma, asi pude lograr que lo haga correctamente.
Gracias por tu tiempo.

Código: C#
  1.  
  2.  private void sumaSaldosFactura()
  3.         {
  4.             try
  5.             {
  6.                 sumatoria = 0;
  7.                 foreach (DataGridViewRow row in dataGridView1.Rows)
  8.                 {
  9.                     try
  10.                     {
  11.                         if (row.Cells["colAdmin"].Value.ToString() == "1")
  12.                         {
  13.                             sumatoria += Convert.ToDouble(row.Cells[4].Value);
  14.                         }
  15.                     }
  16.                     catch
  17.                     {
  18.                     }
  19.                 }
  20.                 tbSumatoria.Text = Convert.ToString(sumatoria);    //aqui se graba el total
  21.                 tbSumatoria.Text = (double.Parse(tbSumatoria.Text)).ToString("#,#.00");
  22.             }
  23.             catch(Exception e)
  24.             {
  25.                 MessageBox.Show(e.Message,e.GetType().ToString());
  26.             }
  27.         }
  28.  
  29.         private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
  30.         {  
  31.             //if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() == "1")
  32.             //    dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = "0";
  33.             //else
  34.             //    dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = "1";
  35.             sumaSaldosFactura();
  36.         }
  37.         private void bLimpiar1_Click(object sender, EventArgs e)
  38.         {
  39.             Generales.limpiaForm(this);
  40.             //dataGridView1.DataSource = new BasicoNG().listarFacturasAdmin(conexionOracle, tbcampoConsulta);
  41.         }
  42.  
  43.         private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
  44.         {
  45.             if (dataGridView1.IsCurrentCellDirty)
  46.             {
  47.                 dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
  48.             }
  49.         }
  50.  
  51.  
  52.