计算值DataGridView

时间:2015-11-10 19:23:36

标签: c# winforms datagridview

我有一个带ID,Depense,Recette和Balance的DataGridView:

通过添加之前的Balance + Depence + Recette来计算余额。

我有3个按钮,AddProduct,UpdateProduct和DeleteProduct。

  • AddProduct:它会在DataGridView中添加一行,但是如果DataGridView为空,(第1行)Balance = 0 + 10 + 10,如果isn&t; t,(第3行)Balance = 60 + 30 + 30 = 120。

  • UpdateProduct:我更新一行,它会影响其他数据,例如,如果我用Depense和Recette = 50更新最后一行,那么最后的余额将是220和。

  • DeleteProduct:与UpdateProduct按钮的想法相同,但只是从受影响的行中删除Balance。我删除第二行,第3行和第4行受到影响。

enter image description here

我的问题怎么做?

更新: 在DataGridView中显示数据的代码

private void BindGrid()
    {
        DataGridViewTresorerie.DataSource = null;
        using (SqlConnection con = new SqlConnection(connstring))
        {
            using (SqlCommand cmd = new SqlCommand("select IdTre,Depense,Recette,Balance from Tresorerie", con))
            {
                cmd.CommandType = CommandType.Text;
                using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
                {
                    using (DataTable dt = new DataTable())
                    {
                        sda.Fill(dt);
                        DataGridViewTresorerie.DataSource = dt;
                    }
                }
            }
        }
    }

更新2:我添加了一个从DataGridView第二行计算余额的方法,然后我在添加,更新和删除中调用该方法,但没有任何反应。

 Decimal BalanceInput;
    int IdTreInput;
    private void UpdateBalance()
    {
        for (int i = 1; i < DataGridViewTresorerie.Rows.Count; i++)
        {
            BalanceInput = Convert.ToDecimal(DataGridViewTresorerie.Rows[i].Cells[3].Value) + Convert.ToDecimal(DataGridViewTresorerie.Rows[i - 1].Cells[12].Value);
            IdTreInput = Convert.ToInt32(DataGridViewTresorerie.Rows[i].Cells[0].Value);
            using (SqlConnection con = new SqlConnection(connstring))
            {
                using (SqlCommand cmd = new SqlCommand("Update Tresorerie set Balance= @Balance  WHERE IdTre = @IdTre", con))
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Parameters.AddWithValue("@Balance", BalanceInput);
                    cmd.Parameters.AddWithValue("@IdTre", IdTreInput);
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
            }
            //I call the new DataGridView to recalculate again after modify or add or delete the new data
            BindGrid();
        }
    }

更新3:我修改了代码,当我点击o按钮进行测试时我调用它,第一次点击效果很好,但是当我再次点击它再次添加总和时,我又添加了一个&#39; for& #39;单独计算每一行的余额,但什么也没发生,它仍然存在同样的问题

Decimal BalanceInput=0;
    int IdTreInput;
    private void UpdateBalance()
    {
        // calculate again somme of balance
        for (int i = 0; i < DataGridViewTresorerie.Rows.Count; i++)
        {
            BalanceInput = Convert.ToDecimal(DataGridViewTresorerie.Rows[i].Cells[11].Value) + Convert.ToDecimal(DataGridViewTresorerie.Rows[i].Cells[12].Value);
            IdTreInput = Convert.ToInt32(DataGridViewTresorerie.Rows[i].Cells[1].Value);
            using (SqlConnection con = new SqlConnection(connstring))
            {
                using (SqlCommand cmd = new SqlCommand("Update Tresorerie set Balance= @Balance  WHERE IdTre = @IdTre", con))
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Parameters.AddWithValue("@Balance", BalanceInput);
                    cmd.Parameters.AddWithValue("@IdTre", IdTreInput);
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
            }
        }

        // update balance
        for (int i = 0; i < DataGridViewTresorerie.Rows.Count; i++)
        {
            if (i == 0)

                BalanceInput = Convert.ToDecimal(DataGridViewTresorerie.Rows[i].Cells[13].Value);
            else
            {
                BalanceInput += Convert.ToDecimal(DataGridViewTresorerie.Rows[i].Cells[13].Value);
                IdTreInput = Convert.ToInt32(DataGridViewTresorerie.Rows[i].Cells[1].Value);
                using (SqlConnection con = new SqlConnection(connstring))
                {
                    using (SqlCommand cmd = new SqlCommand("Update Tresorerie set Balance= @Balance  WHERE IdTre = @IdTre", con))
                    {
                        cmd.CommandType = CommandType.Text;
                        cmd.Parameters.AddWithValue("@Balance", BalanceInput);
                        cmd.Parameters.AddWithValue("@IdTre", IdTreInput);
                        con.Open();
                        cmd.ExecuteNonQuery();
                        con.Close();
                    }
                }
                //I call the new DataGridView to recalculate again after modify or add or delete the new data
                BindGrid();
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

我在评论中的意思是更新基础数据源 - 在您的情况下,它是分配给DataTable的{​​{1}}。像这样的东西

DataGridView.DataSource

在您想要更新余额时随时调用此方法。数据网格视图将自动更新。