我有一个带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行受到影响。
我的问题怎么做?
更新: 在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();
}
}
}
答案 0 :(得分:1)
我在评论中的意思是更新基础数据源 - 在您的情况下,它是分配给DataTable
的{{1}}。像这样的东西
DataGridView.DataSource
在您想要更新余额时随时调用此方法。数据网格视图将自动更新。