DataGridView选中的单元格求和

DataGridView单元格求和功能的基本思路是先得到选中的单元格,
1,在内存中定义两张表,一张存放列名,一张存放列名和数个。这样这两张表就开成了一对多的父子关系。

2,在将两张定及他们的父子关系添加到DataSet对象中
4,接下来就是对两张表的操作,遍历循环算出各列的数值
5,最后计算各列的数值求出和计,再用字符串变量将这些数据保存
6,使用ToolTip对象将字符串的内容显示出来
注意,事先定义两个数组,进行补位操作。使显示出来的内容格式很整齐
代码如下

        ///         
        /// DataGridView多选选中求和        
        ///         


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

DataGridView选中的单元格求和_第1张图片

你可能感兴趣的:(c#)