DataGridView选中的单元格求和

[img]http://dl.iteye.com/upload/attachment/0063/7365/07e27b9b-c059-3ea4-93f4-59a15ad6d201.jpg[/img]
[size=large] DataGridView0单元格求和功能的基本思路是先得到选中的单元格,
2,在内存中定义两张表,一张存放列名,一张存放列名和数个。这样这两张表就开成了种一对多的父子关系。3,在将两张定及他们的父子关系添加到DataSet对象中
4,接下来就是对两张表的操作,遍历循环算出各列的数值
5,最后计算各列的数值求出和计,再用字符串变量将这些数据保存
6,使用ToolTip对象将字符串的内容显示出来
注意,事先定义两个数组,进行补位操作。使显示出来的内容格式很整齐
代码如下:[/size]
   /// <summary>
/// DataGridView多选选中求和
/// </summary>
public class MultiSelectSum
{
/// <summary>
/// DataGridView选中的单元格求和
/// </summary>
/// <param name="dgv"></param>
/// <param name="toolTip"></param>
public bool DataGridViewSelectCellsSum(DataGridView dgv, ToolTip toolTip)
{
//verify
if (dgv.SelectedCells.Count < 2 )
{
toolTip.RemoveAll();
return false;
}
//选中的单元格大于10000个或者DataGridView是全选
if (dgv.SelectedCells.Count > 10000 || dgv.SelectedCells.Count == dgv.GetCellCount(DataGridViewElementStates.None))
{
toolTip.RemoveAll();
return false;
}

DataSet Ds = new DataSet();
System.Data.DataTable DGroup = new System.Data.DataTable("DGroup");// 存放列名
System.Data. DataTable Dt = new System.Data.DataTable("Dt");//存放列名和数值
ArrayList MaxNameLength=new ArrayList(); //保存列名的长度
ArrayList MaxValueLength=new ArrayList();//保存数值的长度

DGroup.Columns.Add("ColumnName", typeof(string));
Dt.Columns.Add("ColumnName", typeof(string));
Dt.Columns.Add("ColumnValue", typeof(decimal));

DataRow dr = null;
//遍历选中单元格的值
foreach (DataGridViewCell cell in dgv.SelectedCells)
{
dr = Dt.NewRow();

if (cell.ValueType.Name.ToString().ToLower()=="decimal" || cell.ValueType.Name.ToString().ToLower()=="int32")
{


dr["ColumnName"] = dgv.Columns[cell.ColumnIndex].Name;
if (cell.Value == null)
{
dr["ColumnValue"] = 0;
}
else
{
dr["ColumnValue"] = cell.Value.ToString();
MaxValueLength.Add(cell.Value.ToString().Length);
}

Dt.Rows.Add(dr);


//判断将要添加进去的列值是否在DGroup中已存在
if (DGroup.Select("ColumnName='" + dgv.Columns[cell.ColumnIndex].Name + "'").Length == 0)
{
DataRow dr1 = DGroup.NewRow();
dr1["ColumnName"] = dgv.Columns[cell.ColumnIndex].Name;
DGroup.Rows.Add(dr1);
MaxNameLength.Add(dgv.Columns[cell.ColumnIndex].Name.Length);

}
}
}

Ds.Tables.Add(DGroup);
Ds.Tables.Add(Dt);

DataRelation dRelation = new DataRelation("dataRel", Ds.Tables["DGroup"].Columns["ColumnName"], Ds.Tables["Dt"].Columns["ColumnName"]);
Ds.Relations.Add(dRelation);
DGroup.Columns.Add("ColumnSum").Expression = "sum(child(dataRel).ColumnValue)";//添加一个总计列,并对各列求值
string desSum = Dt.Compute("sum(ColumnValue)", "").ToString();//求Dt表ColumnValue列的总计

MaxNameLength.Add("总合计:".Length);
MaxValueLength.Add(desSum.Length);

DGroup.AcceptChanges();//提交对DGroup表的修改

MaxNameLength.Sort();
MaxValueLength.Sort();
int MaxNameLen; //保存最大列名长度
int MaxValueLen;//保存最大数值长度
MaxNameLen = Convert.ToInt32(MaxNameLength[MaxNameLength.Count - 1]);
MaxValueLen = Convert.ToInt32(MaxValueLength[MaxValueLength.Count - 1]);

string title = "";//提示信息
for (int i = 0; i < DGroup.Rows.Count; i++)
{
string strOneLine = "";
strOneLine = (DGroup.Rows[i]["ColumnName"].ToString()+":").PadRight(MaxNameLen + 1, ' ');
strOneLine = strOneLine + (DGroup.Rows[i]["ColumnSum"].ToString()).PadLeft(MaxValueLen, ' ');
title = title + strOneLine + System.Environment.NewLine;//换行

}
title = title + "总合计:".PadRight(MaxNameLen + 1, ' ') + desSum.PadLeft(MaxNameLen + 1, ' ');

dgv.ShowCellToolTips = false;

toolTip.ToolTipIcon = ToolTipIcon.Info;
toolTip.ToolTipTitle = "鼠标选定合计信息:";
toolTip.IsBalloon = true;//气球形状
toolTip.UseAnimation = true;
toolTip.AutoPopDelay = 10000;
toolTip.RemoveAll();
toolTip.SetToolTip(dgv,title );
DGroup.Dispose();
Dt.Dispose();
GC.Collect();
return true;

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值