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 1238http://bbs.csdn.net/topics/3907 ... -
C#发送邮件
2015-04-17 15:58 693public class SendEmailHelper ... -
C# xml文件读取
2015-02-11 16:08 639看附件................ -
什么时候该用委托,为什么要用委托,委托有什么好处....
2015-01-29 16:56 814http://www.cnblogs.com/superpce ... -
C#中动态加载和卸载DLL
2015-01-26 14:02 1419在C++中加载和卸载DLL是一件很容易的事,LoadLibra ... -
转:c#常用的18种设计模式
2015-01-21 08:16 767http://blog.jobbole.com/78130/ -
C#委托的介绍(delegate、Action、Func、predicate)
2015-01-09 17:26 1114http://www.cnblogs.com/akwwl/p/ ... -
接口和抽象类有什么区别 .
2014-12-22 16:35 614接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么 ... -
C#一个简单写日志文件的类
2014-12-11 09:57 1107/// <summary> /// L ... -
Linq初级班 Linq to DataSet体验(单表、多表联合查询JOIN语法)
2014-12-10 14:34 353http://www.cnblogs.com/huangcon ... -
C#泛型详解
2014-11-29 11:31 479我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处 ... -
线程同步与异步的区别
2014-11-26 09:12 874异步处理就是按照不同步的程序处理问题。异步处理与同步处理是对立 ... -
应用C#和SQLCLR编写SQL Server用户定义函数 .
2013-10-09 17:07 482http://blog.csdn.net/zhzuo/arti ... -
log4Net简介
2013-06-30 11:32 574使用log4Net可以将系统听日志保存到DB、日志文件、邮箱中 ... -
DataGridView历史记录的前进与后退操作
2013-06-23 11:13 1107此功能介绍:DataGridView频繁查询数据时,可以将每次 ... -
c# 对INI配置文件的读取操作
2013-06-17 10:51 675此种方法只对如下格式的INI文件起作用 server=loca ... -
对DataGridView控件的扩展开发
2013-06-15 21:47 2376首先在项目中引用 ... -
对集合控件(ListBox,ComboBox,TreeView,RichTextBox,DataGridView)的查找、替换操作控件
2013-06-15 09:39 1544一、程序入口: using System; using ... -
C#对文件、文件夹操作公用组件
2013-06-11 09:46 967namespace HR.Class.IO { / ... -
TreeView控件操作开发篇之(五)
2013-06-09 00:09 824#region 加载文件夹及文件到树 ...
相关推荐
Visual C++源代码 139 如何格式化DataGridView指定单元格Visual C++源代码 139 如何格式化DataGridView指定单元格Visual C++源代码 139 如何格式化DataGridView指定单元格Visual C++源代码 139 如何格式化...
本篇将详细讲解如何在C#环境下,实现DataGridView的纵向和横向合并单元格。 首先,我们需要理解“纵向合并”和“横向合并”的概念。纵向合并是指将多个连续的行合并成一个大行,共享同一个单元格内容;横向合并则是...
在某些情况下,我们可能需要对`DataGridView`的单元格进行合并,例如创建标题行或者汇总行。这篇文档将详细阐述如何使用C#语言来实现`DataGridView`控件的单元格合并功能。 首先,我们要理解`DataGridView`控件的...
本篇文章将深入探讨如何在C#的`DataGridView`中实现单元格的合并,以增强数据展示的效果。 首先,我们需要理解`DataGridView`的结构。它由行(Rows)和列(Columns)组成,每个单元格(Cell)是行列交叉点。在默认...
Winform下DataGridView单元格合并技术详解 在Winform开发中,DataGridView控件是非常常用的控件之一,它可以用来显示和编辑数据。但是,在实际开发中,我们经常会遇到需要合并单元格的问题,例如,在DataGridView中...
c# winform ===datagridview 单元格合并 c# winform ===datagridview 单元格合并 c# winform ===datagridview 单元格合并
### DataGridView单元格合并 单元格合并在`DataGridView`中通常是为了解决数据分组或展示多列信息于同一单元格的需求。`DataGridView`不直接支持单元格合并,但可以通过自定义绘制单元格来实现。关键步骤包括: 1....
要获取某个单元格的坐标,我们可以使用`CurrentCell`属性来访问当前选中的单元格,或者直接通过行和列索引来访问特定单元格。例如: ```csharp // 获取当前选中单元格的行列坐标 int currentRowIndex = ...
本实例将探讨如何在C++.NET环境下对DataGridView控件的指定单元格进行格式化。 首先,理解基本概念。DataGridView控件由行和列组成,每个交叉点即为一个单元格。我们可以根据行索引(RowIndex)和列索引(Column...
一、DataGridView单元格合并 在`DataGridView`中,单元格合并通常用于创建具有复杂布局的表格,比如合并相同值的行或列,或者创建跨多行的标题。以下是一些关键步骤: 1. **设置AutoGenerateColumns为False**:...
这个“VB.net dataGridview 单元格内容相同合并.rar”压缩包包含了一个实用的功能,即当`DataGridView`中的单元格内容相同时,可以自动进行合并,以提供更清晰的数据展示效果。这种功能在数据报表或者统计分析界面中...
标题"datagridview横向合并单元格"涉及到的是如何在`DataGridView`中实现列的合并,这在展示某些特定类型的数据时非常有用,比如汇总信息或者创建带有标题的复合单元格。下面将详细阐述`DataGridView`的列合并以及...
总的来说,"C# DataGridView单元格自动合并相同项自定义控件源码"是一个实用的工具,它解决了`DataGridView`在显示大量重复数据时的常见问题,提高了数据可视化的效果。通过深入研究和理解这个源码,开发者可以学习...
本主题将深入探讨如何在`DataGridView`中实现单元格和列头的合并,以增强界面展示效果和信息组织。 一、简介 `DataGridView`控件允许用户以表格形式查看和编辑数据。在某些情况下,为了清晰地呈现复杂的数据结构...
### DataGridview 重写单元格为日期控件的知识点详解 #### 一、概述 在.NET Framework中,`DataGridView` 控件是非常强大的表格显示工具,它可以用来展示大量的数据,并且支持高度定制化的需求。本篇文章主要介绍...
- 设置DataGridView单元格样式的方法 - 异常值标注的应用场景 - 使用C#编程语言进行DataGridView单元格样式的设置 - 颜色属性及自定义颜色设置 #### DataGridView控件简介 DataGridView是.NET框架中的一个重要控件...
这个主题“C# DataGridView单元格中动态添加多个控件”就涵盖了如何在`DataGridView`的单元格内部动态创建和管理多个控件。 在VS2012中,我们可以利用事件驱动编程和反射技术来实现这一目标。首先,我们需要理解`...