2015-11-10 140 views
1

我有一個DataGridView ID爲,Depense,抗皺和餘額:計算值的DataGridView

餘額的計算方法通過添加前一資產負債+ Depence +抗皺。

我有3個按鈕,AddProduct,UpdateProduct和DeleteProduct。

  • addProduct命令:它會增加一行到的DataGridView,但如果在DataGridView是空的,(第一線)餘額= 0 + 10 + 10,並且如果不是,(第三行)餘額= 60 + 30 + 30 = 120。例如,如果我用Depense和Recette = 50更新最後一行,所以最後的平衡值將是220和。如果我更新了最後一行Depense和Recette = 50,那麼最後的平衡值將是220和255。

  • DeleteProduct:UpdateProduct的按鈕也是一樣的想法,但只是從受影響的行中刪除餘額。我刪除了第二行,第三行和第四行受到了影響。

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按鈕進行測試,第一次點擊可以完美運行,但是當我再次點擊它再次添加總結,所以我再添「爲「來計算單獨的每一行的平衡,但沒有發生,它保持了同樣的問題

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

我們看到你有一個DataGrid ** View **,但是你有什麼**數據**?換句話說,你是使用綁定還是非綁定模式?如果綁定,數據源的類型是什麼? –

+0

我從sql server獲得日期,並在datagridview中顯示它,在計算每一行的新餘額後,我更新表格。 – Juste3alfaz

+1

我問的是你使用類似'gridView.DataSource = something;'的東西。如果是,請顯示「某事」。 –

回答

1

我的意見是什麼意思是更新基礎數據源 - 在你的情況下,它被分配了DataTableDataGridView.DataSource。類似這樣的東西

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

隨時調用此更新餘額。數據網格視圖將自動更新。

+0

thnx它的工作原理:D – Juste3alfaz