DataGridView0单元格求和功能的基本思路是先得到选中的单元格,
2,在内存中定义两张表,一张存放列名,一张存放列名和数个。这样这两张表就开成了种一对多的父子关系。3,在将两张定及他们的父子关系添加到DataSet对象中
4,接下来就是对两张表的操作,遍历循环算出各列的数值
5,最后计算各列的数值求出和计,再用字符串变量将这些数据保存
6,使用ToolTip对象将字符串的内容显示出来
注意,事先定义两个数组,进行补位操作。使显示出来的内容格式很整齐
代码如下:
/// <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; } }
发表评论
-
C# 实现将文件夹分卷压缩
2015-04-17 17:01 1222http://bbs.csdn.net/topics/3907 ... -
C#发送邮件
2015-04-17 15:58 683public class SendEmailHelper ... -
C# xml文件读取
2015-02-11 16:08 615看附件................ -
什么时候该用委托,为什么要用委托,委托有什么好处....
2015-01-29 16:56 806http://www.cnblogs.com/superpce ... -
C#中动态加载和卸载DLL
2015-01-26 14:02 1411在C++中加载和卸载DLL是一件很容易的事,LoadLibra ... -
转:c#常用的18种设计模式
2015-01-21 08:16 749http://blog.jobbole.com/78130/ -
C#委托的介绍(delegate、Action、Func、predicate)
2015-01-09 17:26 1097http://www.cnblogs.com/akwwl/p/ ... -
接口和抽象类有什么区别 .
2014-12-22 16:35 607接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么 ... -
C#一个简单写日志文件的类
2014-12-11 09:57 1099/// <summary> /// L ... -
Linq初级班 Linq to DataSet体验(单表、多表联合查询JOIN语法)
2014-12-10 14:34 345http://www.cnblogs.com/huangcon ... -
C#泛型详解
2014-11-29 11:31 467我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处 ... -
线程同步与异步的区别
2014-11-26 09:12 865异步处理就是按照不同步的程序处理问题。异步处理与同步处理是对立 ... -
应用C#和SQLCLR编写SQL Server用户定义函数 .
2013-10-09 17:07 474http://blog.csdn.net/zhzuo/arti ... -
log4Net简介
2013-06-30 11:32 561使用log4Net可以将系统听日志保存到DB、日志文件、邮箱中 ... -
DataGridView历史记录的前进与后退操作
2013-06-23 11:13 1100此功能介绍:DataGridView频繁查询数据时,可以将每次 ... -
c# 对INI配置文件的读取操作
2013-06-17 10:51 672此种方法只对如下格式的INI文件起作用 server=loca ... -
对DataGridView控件的扩展开发
2013-06-15 21:47 2365首先在项目中引用 ... -
对集合控件(ListBox,ComboBox,TreeView,RichTextBox,DataGridView)的查找、替换操作控件
2013-06-15 09:39 1537一、程序入口: using System; using ... -
C#对文件、文件夹操作公用组件
2013-06-11 09:46 961namespace HR.Class.IO { / ... -
TreeView控件操作开发篇之(五)
2013-06-09 00:09 816#region 加载文件夹及文件到树 ...
相关推荐
2. **遍历选中的单元格**:`dataGridView1.SelectedCells`属性返回一个包含所有选中单元格的列表。通过循环遍历这个列表,我们可以检查每个单元格是否含有有效的数据。 3. **转换并累加**:使用`Double.Parse()`...
这可以通过遍历`DataGridView.Rows`集合,对每个数值单元格(`DataGridViewCell`)的`Value`属性求和来实现。但是,如果使用了`AX.SubDataGrid.dll`,可能有更便捷的方法,例如调用特定的API函数来自动添加合计行。 ...
还有通过CSS实现固定表头、自定义格式化、突出显示特定单元格、自动求和等功能,这些都提高了用户体验和数据展示效果。 这些代码片段对于开发者来说是非常实用的资源,它们提供了快速实现特定功能的代码模板,可以...