【问题标题】:Calculate Value DataGridView计算值DataGridView
【发布时间】:2015-11-10 19:23:35
【问题描述】:

我有一个带有 id、Depense、Recette 和 Balance 的 DataGridView:

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

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

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

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

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

我的问题怎么办?

更新: 在 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 按钮进行测试时调用它,第一次单击效果很好,但是当我再次单击时它再次添加总和,因此我添加了另一个“for”来计算仅每一行的平衡,但什么也没发生,它仍然是同样的问题

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();
            }
        }
    }

【问题讨论】:

  • 我们看到您有一个 DataGridView,但是您有什么 data?换句话说,您使用的是绑定模式还是非绑定模式?如果绑定,数据源的类型是什么?
  • 我从 sql server 获取日期,并显示在 datagridview 中,计算出每一行的新余额后,我更新表格。
  • 我要问的是你是否使用类似gridView.DataSource = something; 的东西。如果是,请显示something
  • 好的,所以它是DataTable 并且有Balance 列。您只需要在 table 中的每个 AddUpdateDelete DataRow 之后,相应地更新。网格会自动显示。
  • 好的,我这样做了,但什么也没发生

标签: c# winforms datagridview


【解决方案1】:

我在 cmets 中的意思是更新基础数据源 - 在您的情况下,它是分配给 DataGridView.DataSourceDataTable。像这样的

static void UpdateBalance(DataGridView dataGridView)
{
    var dataTable = (DataTable)dataGridView.DataSource;
    var recetteColumn = dataTable.Columns["Recette"];
    var depenseColumn = dataTable.Columns["Depense"];
    var balanceColumn = dataTable.Columns["Balance"];
    decimal balance = 0;
    for (int i = 0; i < dataTable.Rows.Count; i++)
    {
        var dataRow = dataTable.Rows[i];
        balance += (decimal)dataRow[recetteColumn] + (decimal)dataRow[depenseColumn];
        dataRow[balanceColumn] = balance;
    }
}

只要您想更新余额,请随时调用。数据网格视图将自动更新。

【讨论】:

    猜你喜欢
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多