for (int i = 1; i < this.dgv1.Rows.Count - 1; i++)
{
// //若与下一单元格值不同
if (dgv1.Rows[i].Cells[“产品编号”].Value.ToString().Trim () == dgv1.Rows[i-1].Cells[产品编号].Value.ToString().Trim ())
{
td += Convert.ToDecimal(this.dgv1.Rows[i].Cells[数量].Value.ToString());
}
dgv1.Rows[i].Cells[备注].Value = td.ToString().Trim();
}
如上,我将相同编号的产品的数量累加到备注列,遍历后不能达到效果,我刚学,请教能有详细解答,是用数组,还是DATATABLE,当在dgv1(DataGridVies)中更改数量时,备注也相应更新,不用再去数据库里更新了,只是在DGV中显示,然后打印。打印我做出来了,这是这个累加不好做。
如果是从数据库取出来的数据,你就再取一组根据select sum(数量) from 表 group by 编号就能直接获取到每个编号的合计了
如果是数组处理:
// //若与下一单元格值不同
for (int i = 1; i < this.dgv1.Rows.Count - 1; i++)
{
if (i==1){
td = Convert . ToDecimal(this . dgv1 . Rows[i] . Cells[数量] . Value . ToString());
}
if (dgv1 . Rows[i] . Cells[“产品编号”] . Value . ToString() . Trim() == dgv1 . Rows[i - 1] . Cells[产品编号] . Value . ToString() . Trim()) {
td += Convert . ToDecimal(this . dgv1 . Rows[i] . Cells[数量] . Value . ToString());
}else{
dgv1 . Rows[i] . Cells[备注] . Value = td . ToString() . Trim();
td = 0;
}
}
我只是做了处理合计,显示的位置是每个值的最后一行,要显示在每个编号的第一行,你自己处理下就好了
备注更新的你只要通过数据修改的时候失去焦点触发处理下备注就好了
按照你的需求做了一个简单的示例,先看效果:
核心思路:监听DataGridView单元格的CellValueChanged
事件。
示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApp1.Forms.Demo2
{
public partial class Form7 : Form
{
public Form7()
{
InitializeComponent();
}
private List<Order> _orders;
private void Form7_Load(object sender, EventArgs e)
{
Init();
dataGridView1.DataSource = _orders;
}
private void Init()
{
_orders = new List<Order>
{
new Order{Number = "A", ProductCode = "A101",ProductName = "产品A",Quantity = 100,Remark = ""},
new Order{Number = "B", ProductCode = "A101",ProductName = "产品A",Quantity = 50,Remark = ""},
new Order{Number = "B", ProductCode = "A102",ProductName = "产品B",Quantity = 50,Remark = ""},
new Order{Number = "B", ProductCode = "A102",ProductName = "产品B",Quantity = 30,Remark = ""},
new Order{Number = "C", ProductCode = "A102",ProductName = "产品B",Quantity = 20,Remark = ""},
new Order{Number = "A", ProductCode = "A103",ProductName = "产品C",Quantity = 1000,Remark = ""}
};
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex != 3)
{
return;
}
var productCode = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();
var sum = _orders.Where(x => x.ProductCode == productCode).Sum(x => x.Quantity);
foreach (var order in _orders.Where(x => x.ProductCode == productCode))
{
order.Remark = sum.ToString();
}
dataGridView1.DataSource = _orders;
dataGridView1.Refresh();
}
}
public class Order
{
public string Number { get; set; }
public string ProductCode { get; set; }
public string ProductName { get; set; }
public int Quantity { get; set; }
public string Remark { get; set; }
}
}
或者,只修改同一分组的第一条备注:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApp1.Forms.Demo2
{
public partial class Form7 : Form
{
public Form7()
{
InitializeComponent();
}
private List<Order> _orders;
private void Form7_Load(object sender, EventArgs e)
{
Init();
dataGridView1.DataSource = _orders;
}
private void Init()
{
_orders = new List<Order>
{
new Order{Number = "A", ProductCode = "A101",ProductName = "产品A",Quantity = 100,Remark = ""},
new Order{Number = "B", ProductCode = "A101",ProductName = "产品A",Quantity = 50,Remark = ""},
new Order{Number = "B", ProductCode = "A102",ProductName = "产品B",Quantity = 50,Remark = ""},
new Order{Number = "B", ProductCode = "A102",ProductName = "产品B",Quantity = 30,Remark = ""},
new Order{Number = "C", ProductCode = "A102",ProductName = "产品B",Quantity = 20,Remark = ""},
new Order{Number = "A", ProductCode = "A103",ProductName = "产品C",Quantity = 1000,Remark = ""}
};
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex != 3)
{
return;
}
var productCode = dataGridView1.Rows[e.RowIndex].Cells[1].Value.ToString();
var sum = _orders.Where(x => x.ProductCode == productCode).Sum(x => x.Quantity);
//foreach (var order in _orders.Where(x => x.ProductCode == productCode))
//{
// order.Remark = sum.ToString();
//}
var first = _orders.FirstOrDefault(x => x.ProductCode == productCode);
if (first != null)
{
first.Remark = sum.ToString();
}
dataGridView1.DataSource = _orders;
dataGridView1.Refresh();
}
}
public class Order
{
public string Number { get; set; }
public string ProductCode { get; set; }
public string ProductName { get; set; }
public int Quantity { get; set; }
public string Remark { get; set; }
}
}
double sum=0;
for (int i = 0; i < dataGridView.Rows.Count; i++)
{
sum += Convert.ToDouble(dataGridView.Rows[i].Cells[某列].Value);
}
dgv1.Rows[i].Cells[备注].Value=sum;
给你提供下累加的 模式
使用数据的 分类和汇总就可以实现了 没必要到了datagridview中在进行汇总,你这样做还浪费了效率。
谢谢,这是这个效果,刚学,多谢指导