`

DataGridView选中的单元格求和

    博客分类:
  • C#
阅读更多


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;
               
            }
            
        }
  • 大小: 19.4 KB
分享到:
评论

相关推荐

    Visual C++源代码 139 如何格式化DataGridView指定单元格

    Visual C++源代码 139 如何格式化DataGridView指定单元格Visual C++源代码 139 如何格式化DataGridView指定单元格Visual C++源代码 139 如何格式化DataGridView指定单元格Visual C++源代码 139 如何格式化...

    DataGridView合并单元格(纵向合并及横向合并)

    本篇将详细讲解如何在C#环境下,实现DataGridView的纵向和横向合并单元格。 首先,我们需要理解“纵向合并”和“横向合并”的概念。纵向合并是指将多个连续的行合并成一个大行,共享同一个单元格内容;横向合并则是...

    DataGridView合并单元格

    在某些情况下,我们可能需要对`DataGridView`的单元格进行合并,例如创建标题行或者汇总行。这篇文档将详细阐述如何使用C#语言来实现`DataGridView`控件的单元格合并功能。 首先,我们要理解`DataGridView`控件的...

    C# DataGridView 合并单元格

    本篇文章将深入探讨如何在C#的`DataGridView`中实现单元格的合并,以增强数据展示的效果。 首先,我们需要理解`DataGridView`的结构。它由行(Rows)和列(Columns)组成,每个单元格(Cell)是行列交叉点。在默认...

    在Winfrom下的对DataGridView单元格合并

    Winform下DataGridView单元格合并技术详解 在Winform开发中,DataGridView控件是非常常用的控件之一,它可以用来显示和编辑数据。但是,在实际开发中,我们经常会遇到需要合并单元格的问题,例如,在DataGridView中...

    c# winform ===datagridview 单元格合并

    c# winform ===datagridview 单元格合并 c# winform ===datagridview 单元格合并 c# winform ===datagridview 单元格合并

    DataGridView单元格合并和DataGridView二维表头

    ### DataGridView单元格合并 单元格合并在`DataGridView`中通常是为了解决数据分组或展示多列信息于同一单元格的需求。`DataGridView`不直接支持单元格合并,但可以通过自定义绘制单元格来实现。关键步骤包括: 1....

    获取设置datagridview控件中单元格、行和列坐标

    要获取某个单元格的坐标,我们可以使用`CurrentCell`属性来访问当前选中的单元格,或者直接通过行和列索引来访问特定单元格。例如: ```csharp // 获取当前选中单元格的行列坐标 int currentRowIndex = ...

    格式化DataGridView指定单元格 编程小实例

    本实例将探讨如何在C++.NET环境下对DataGridView控件的指定单元格进行格式化。 首先,理解基本概念。DataGridView控件由行和列组成,每个交叉点即为一个单元格。我们可以根据行索引(RowIndex)和列索引(Column...

    DataGridView单元格合并和二维表头_datagridview_

    一、DataGridView单元格合并 在`DataGridView`中,单元格合并通常用于创建具有复杂布局的表格,比如合并相同值的行或列,或者创建跨多行的标题。以下是一些关键步骤: 1. **设置AutoGenerateColumns为False**:...

    VB.net dataGridview 单元格内容相同合并.rar

    这个“VB.net dataGridview 单元格内容相同合并.rar”压缩包包含了一个实用的功能,即当`DataGridView`中的单元格内容相同时,可以自动进行合并,以提供更清晰的数据展示效果。这种功能在数据报表或者统计分析界面中...

    datagridview横向合并单元格

    标题"datagridview横向合并单元格"涉及到的是如何在`DataGridView`中实现列的合并,这在展示某些特定类型的数据时非常有用,比如汇总信息或者创建带有标题的复合单元格。下面将详细阐述`DataGridView`的列合并以及...

    C#DataGridView单元格自动合并相同项自定义控件源码.zip

    总的来说,"C# DataGridView单元格自动合并相同项自定义控件源码"是一个实用的工具,它解决了`DataGridView`在显示大量重复数据时的常见问题,提高了数据可视化的效果。通过深入研究和理解这个源码,开发者可以学习...

    DataGridView合并单元格和列头

    本主题将深入探讨如何在`DataGridView`中实现单元格和列头的合并,以增强界面展示效果和信息组织。 一、简介 `DataGridView`控件允许用户以表格形式查看和编辑数据。在某些情况下,为了清晰地呈现复杂的数据结构...

    datagridview 重写单元格代码

    ### DataGridview 重写单元格为日期控件的知识点详解 #### 一、概述 在.NET Framework中,`DataGridView` 控件是非常强大的表格显示工具,它可以用来展示大量的数据,并且支持高度定制化的需求。本篇文章主要介绍...

    设定DataGridView的单元格Style

    - 设置DataGridView单元格样式的方法 - 异常值标注的应用场景 - 使用C#编程语言进行DataGridView单元格样式的设置 - 颜色属性及自定义颜色设置 #### DataGridView控件简介 DataGridView是.NET框架中的一个重要控件...

    C# DataGridView单元格中动态添加多个控件

    这个主题“C# DataGridView单元格中动态添加多个控件”就涵盖了如何在`DataGridView`的单元格内部动态创建和管理多个控件。 在VS2012中,我们可以利用事件驱动编程和反射技术来实现这一目标。首先,我们需要理解`...

Global site tag (gtag.js) - Google Analytics