DataGridView单元格求和功能的基本思路是先得到选中的单元格,
1,在内存中定义两张表,一张存放列名,一张存放列名和数个。这样这两张表就开成了一对多的父子关系。
2,在将两张定及他们的父子关系添加到DataSet对象中
4,接下来就是对两张表的操作,遍历循环算出各列的数值
5,最后计算各列的数值求出和计,再用字符串变量将这些数据保存
6,使用ToolTip对象将字符串的内容显示出来
注意,事先定义两个数组,进行补位操作。使显示出来的内容格式很整齐
代码如下
/// <summary>
/// DataGridView多选选中求和
/// </summary>
public bool DataGridViewSelectCellsSum(DataGridView dgv, ToolTip toolTip)
{
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;
}