【发布时间】: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 中的每个Add、Update或DeleteDataRow 之后,相应地更新表。网格会自动显示。 -
好的,我这样做了,但什么也没发生
标签: c# winforms datagridview