`

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
分享到:
评论

相关推荐

    C# 选定单元格求和

    2. **遍历选中的单元格**:`dataGridView1.SelectedCells`属性返回一个包含所有选中单元格的列表。通过循环遍历这个列表,我们可以检查每个单元格是否含有有效的数据。 3. **转换并累加**:使用`Double.Parse()`...

    c#中向DataGridView控件中添加合计、平均值、最大值、最小值

    这可以通过遍历`DataGridView.Rows`集合,对每个数值单元格(`DataGridViewCell`)的`Value`属性求和来实现。但是,如果使用了`AX.SubDataGrid.dll`,可能有更便捷的方法,例如调用特定的API函数来自动添加合计行。 ...

    个人经典代码

    还有通过CSS实现固定表头、自定义格式化、突出显示特定单元格、自动求和等功能,这些都提高了用户体验和数据展示效果。 这些代码片段对于开发者来说是非常实用的资源,它们提供了快速实现特定功能的代码模板,可以...

Global site tag (gtag.js) - Google Analytics