我觉得你描述的似乎很模糊,能具体点不,你DATAGRIDVIEW显示的是数据库上的表吗?还是什么的,至少也给个上个图,详细说下。

解决方案 »

  1.   

    金额是只有当单元格离开焦点时才计算,只能这样,你想输入完后立即计算?
    数量和金额合计不能那样算的,要循环列表之后统计参考http://topic.csdn.net/u/20120201/09/735e5496-dd45-454d-8fec-de391558ef7e.html
      

  2.   

    代码更正后,但仍是改完数量或单价,当光标离开所修改值的单元格才能得到金额、金额合计、数量合计。感觉就是事件没先对。更正后的代码: private void dgvStock_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                if (dgvStock.Rows.Count > 0 && e.RowIndex >= 0)
                {
                    if (dgvStock.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.Name == "Price" || dgvStock.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.Name == "Quantity")
                    {
                        try
                        {
                            dgvStock.Rows[e.RowIndex].Cells["Amount"].Value = Convert.ToDecimal(dgvStock.Rows[e.RowIndex].Cells["Quantity"].Value) * Convert.ToDecimal(dgvStock.Rows[e.RowIndex].Cells["Price"].Value);                        //txtFNo.Text = dt.Rows.Count.ToString();
                        }
                        catch { }
                    }
                    decQuantityTotal = 0.00m;
                    decAmountTotal = 0.00m;
                    for (int i = 0; i < dgvStock.Rows.Count; i++)
                    {
                        //统计数量合计
                        try
                        {
                            decQuantityTotal += Convert.ToDecimal(dgvStock.Rows[i].Cells["Quantity"].Value);
                        }
                        catch { }
                        //统计金额合计
                        try
                        {
                            decAmountTotal += Convert.ToDecimal(dgvStock.Rows[i].Cells["Amount"].Value);
                        }
                        catch { }
                    }
                    lblQuantityTotal.Text = decQuantityTotal.ToString();
                    lblAmountTotal.Text = decAmountTotal.ToString();
                }
            }
      

  3.   

    在sql语句中算不是更好吗
      

  4.   

    想单元格得到类似TextBox控件的TextChanged事件效果一样,单价或数量的值一改变,立即更改金额的值.而不是离开单元格时才修改金额的值 .
      

  5.   

    呵呵,前几天也用到类似这样的功能,不过我那个更变态,客户要求公式自定义。我也是在cellchange里处理的,比较卡。后方发现NetAdvantage的控件支持,比较强大。
      

  6.   

     decimal decQuantityTotal = 0.00m;
            decimal decAmountTotal = 0.00m;private void dgvStock_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                if (dgvStock.Rows.Count > 0 && e.RowIndex >= 0)
                {
                    if (dgvStock.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.Name == "Price" || dgvStock.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.Name == "Quantity")
                    {
                        try
                        {
                            dgvStock.Rows[e.RowIndex].Cells["Amount"].Value = Convert.ToDecimal(dgvStock.Rows[e.RowIndex].Cells["Quantity"].Value) * Convert.ToDecimal(dgvStock.Rows[e.RowIndex].Cells["Price"].Value);                        //txtFNo.Text = dt.Rows.Count.ToString();
                          
                            
                            //数量或单价更改后,重新计算 数量合计和金额合计                        for (int i = 0; i < dgvStock.Rows.Count; i++)
                            {
                                //统计数量合计
                                try
                                {
                                    decQuantityTotal += Convert.ToDecimal(dgvStock.Rows[i].Cells["Quantity"].Value);
                                }
                                catch { }
                                //统计金额合计
                                try
                                {
                                    decAmountTotal += Convert.ToDecimal(dgvStock.Rows[i].Cells["Price"].Value);
                                }
                                catch { }
                            }
                            lblQuantityTotal.Text = decQuantityTotal.ToString();
                            lblAmountTotal.Text = decAmountTotal.ToString();
                        }
                        catch { }
                    }
                }
            }
    修改成这样更好吧,不过还是非常感谢