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;}