c# datagridview 相同行求和

netbor 2009-12-03 07:27:00
问题如题:
要求结果如下:

第四列是要将计算结果写入的列,计算要求为:
先找到所有第一列相同的列,然后分别将这些相同的第二,第三列分别求和,然后再将第三列的和减去第二列的和.将结果写在第四列中的所有第一列相同的行中.



列一 列二 列三 列四
A1 10 10 -5
A1 10 5 -5
A1 5 5 -5
B1 10 20 10
B1 5 5 10

如何实现,谢谢各位了,我想了半天,抽了十根烟,就是没想出来,唉.
...全文
504 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
波导终结者 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 netbor 的回复:]
引用 14 楼 alifriend 的回复:
C# code
            DataTable MyDT=new DataTable();
            MyDT.Columns.Add("列1");
            MyDT.Columns.Add("列2");
            MyDT.Columns.Add("列3");
            MyDT.Columns.Add("列4");
    ?-


用哈希表,不错,不过我也想到信方法,用LinSql to object.
谢谢楼上的.学习了.
[/Quote]
哈哈,要是早说可以用08的LinQ那就简单了
netbor 2009-12-03
  • 打赏
  • 举报
回复
打错字了.LinQ
netbor 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 alifriend 的回复:]
C# code
DataTable MyDT=new DataTable();
MyDT.Columns.Add("列1");
MyDT.Columns.Add("列2");
MyDT.Columns.Add("列3");
MyDT.Columns.Add("列4");
?-
[/Quote]

用哈希表,不错,不过我也想到信方法,用LinSql to object.
谢谢楼上的.学习了.
波导终结者 2009-12-03
  • 打赏
  • 举报
回复

DataTable MyDT = new DataTable();
MyDT.Columns.Add("列1");
MyDT.Columns.Add("列2");
MyDT.Columns.Add("列3");
MyDT.Columns.Add("列4");
DataRow row1 = MyDT.NewRow();
row1["列1"] = "A1";
row1["列2"] = 10;
row1["列3"] = 10;
row1["列4"] = "";
MyDT.Rows.Add(row1);
DataRow row2 = MyDT.NewRow();
row2["列1"] = "A1";
row2["列2"] = 10;
row2["列3"] = 5;
row2["列4"] = "";
MyDT.Rows.Add(row2);
DataRow row3 = MyDT.NewRow();
row3["列1"] = "A1";
row3["列2"] = 5;
row3["列3"] = 5;
row3["列4"] = "";
MyDT.Rows.Add(row3);
DataRow row4 = MyDT.NewRow();
row4["列1"] = "B1";
row4["列2"] = 10;
row4["列3"] = 20;
row4["列4"] = "";
MyDT.Rows.Add(row4);
DataRow row5 = MyDT.NewRow();
row5["列1"] = "B1";
row5["列2"] = 5;
row5["列3"] = 5;
row5["列4"] = "";
MyDT.Rows.Add(row5);
Hashtable HT = new Hashtable();
for (int i = 0; i < MyDT.Rows.Count; i++)
{
if (HT.ContainsKey(MyDT.Rows[i][0].ToString()))
{
HT[MyDT.Rows[i][0].ToString()] = Convert.ToInt32(HT[MyDT.Rows[i][0].ToString()])+Convert.ToInt32(MyDT.Rows[i][2]) - Convert.ToInt32(MyDT.Rows[i][1]);
}
else
{
HT.Add(MyDT.Rows[i][0].ToString(), Convert.ToInt32(MyDT.Rows[i][2]) - Convert.ToInt32(MyDT.Rows[i][1]));
}
}
for (int i = 0; i < MyDT.Rows.Count; i++)
{
MyDT.Rows[i][3] = HT[MyDT.Rows[i][0].ToString()];
}
dataGridView1.DataSource = MyDT;
cctv2cctv 2009-12-03
  • 打赏
  • 举报
回复 1
用两个datagridview解决
原来数据表为datagridview1 ,新的空数据为datagridview2
把表datagridview1数据有条件逐行添加到datagridview2
逐行添加思路如下
遍历表datagridview1,如果datagridview2存在A1则第三列相加,第二列也相加
如果datagridview2不存在B1则添加B1,再第三列相加,第二列相加
结果datagridview2就是一个类似A1 B1第二,三列汇总好的新表,再第三列减第二列就是第四列
datagridview2就是最终楼主想要的表格,而且对datagridview1原始数据不作任何修改
datagridview1,datagridview2功能区分明显易于以后数据变更处理
netbor 2009-12-03
  • 打赏
  • 举报
回复
顶上去.
netbor 2009-12-03
  • 打赏
  • 举报
回复
其实原表是这样的.这是一个产线上的实时物料使用状态表.原表第一列是料号,第二列是物料的替代关系.第三列是已发到产线的物料,第四列是产线已用的物料.其中第三,第四列是一个实时变化的,他无法用sql语句直接得到,所以需要在界面上计算,当然,就算可以用sql取得,作为一个实时的表,这样的查询也太耗资源了.

刚才有人说我说得不太清楚,那我就再描述一下.

就是上表示所说的,将所有A1行的第二列,第三列分另求和.再将第三列的结果减去第二列的结果.将最终结果填充到第四列中所有的A1行中.后面以此类推.

列一 列二 列三 列四
A1 10 10 -5
A1 10 5 -5
A1 5 5 -5
-------------------------------
25 20 -5

这个-5就是这么来的.
yang1216 2009-12-03
  • 打赏
  • 举报
回复
那就存进数据库里面咯。
不晓得DataTable里面可不可以用上sql语句,如果可以就好办了。
qqzeng-ip 2009-12-03
  • 打赏
  • 举报
回复
5 行受影响)
L1 L2 L3
-------------------------------------------------- ----------- -----------
A1 10 10
A1 10 5
A1 5 5
B1 10 20
B1 5 5

(5 行受影响)

L1 L2 L3 L4
-------------------------------------------------- ----------- ----------- -----------
A1 10 10 -5
A1 10 5 -5
A1 5 5 -5
B1 10 20 10
B1 5 5 10

(5 行受影响)
netbor 2009-12-03
  • 打赏
  • 举报
回复
很遗憾,只有第一列是来自数据库,所以不可能只用sql
波导终结者 2009-12-03
  • 打赏
  • 举报
回复
declare @test table(L1 varchar(50),L2 int,L3 int)


insert into @test
select 'A1',10,10 union all
select 'A1',10,5 union all
select 'A1',5,5 union all
select 'B1',10,20 union all
select 'B1',5,5

select a.*,b.L4 from @test a join
(select L1,sum(L3)-Sum(L2) as L4 from @test group by L1) b on a.L1=b.L1
wuyq11 2009-12-03
  • 打赏
  • 举报
回复
在SQL中按照列1分组求 列二、 列三和,再实现相减形成第四列
再绑定到datagridview
soaringbird 2009-12-03
  • 打赏
  • 举报
回复

select test1.f1,f2,f3,temp.f4 from test1
left join
(select f1,SUM(f3)-SUM(f2) f4 from test1
group by f1) temp on temp.f1=test1.f1
波导终结者 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 powerchuangwai 的回复:]
第一列相同的列????看不懂...表述有些乱,,感觉,,能否再整理一下,也好帮你看看..
[/Quote]
LZ的意思就是说,在列一相同的那些行(比如说前三行一组,后两行一组)加到一起,将列三的和减去列二,变成列四,其实也就是group by 列一
红街咖啡 2009-12-03
  • 打赏
  • 举报
回复
我想了半天,抽了十根烟,就是没想出来,
几个Foreach
powerchuangwai 2009-12-03
  • 打赏
  • 举报
回复
第一列相同的列????看不懂...表述有些乱,,感觉,,能否再整理一下,也好帮你看看..
波导终结者 2009-12-03
  • 打赏
  • 举报
回复
直接在数据库中处理,group by 列一,然后Join到原来的表上

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧