报表之惑----C#如何添加合计行?

本文介绍了一种在DataGridView中添加总计行的方法,确保该行不参与排序且保持特定颜色。通过在绑定数据源时添加总计行,实现了计算总计并将其显示在DataGridView的最后一行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“众里寻她千百度,蓦然回首,那人却在,灯火阑珊处。”词虽好,但现实比非如此,最近做项目也是碰到了头疼的事,虽然网上关于报表添加总计行的方法很多,但总是让人不知所云,所以自己尝试下这篇博客,我的方法是在DataGridview最后一行添加“合计”行,并保证最后一行不参与排序。
思想:”程序的方法固然重要,但思想是前提“,之前尝试直接在Datagridview添加合计行,发现总是行不通,所有打算直接在绑定数据源时添加。
首先:这是在datagridview中添加行,必备工具我这里不废话(Form,DataGridview控件,DataGridview各字段绑定数据源)。
第一步:右击Form—-查看代码—-添加方法

private void AddTotalRow(DataGridView dg)
        {
            MySQLHelper dbHelper = new MySQLHelper();//这里我直接用封装的类库,需要这个的可以发邮件给我liucheng.chn@foxmail.com
            dbHelper.creatCommand("SQL语句");//关于C#如何操作数据库和绑定数据源,相信应该都会吧,有疑问的可以发邮件给我
             DataTable addTotalRow = dbHelper.executeQuery();  //执行SQL语句
             //计算总输入
            Decimal totalCost = 0;
            DataRow newRow = addTotalRow.NewRow();
            for (int i = 0; i < addTotalRow.Rows.Count; i++)
            {
                totalCost += Convert.ToDecimal(addTotalRow.Rows[i][14].ToString());//这里14代表我的表格中第14列是价格,这个没有统一标准
            }
            newRow["cost"] = totalCost;//cost是Datatable的字段,表示在cost这个字段添加一个为totalCost的数据
            newRow["id"] = "合计:"+ totalCost;//在Datatable中id这个字段添加"合计"和totalCost,这里需说明下,合计这个属性的位置按照个人需求添加,我是在id行添加
            addTotalRow.Rows.Add(newRow);//把新创建的"合计"行添加到Datatable中
            dataGridViewAddTotalRow.DataSource = addTotalRow;
            KeepYellow(dataGridViewAddTotalRow);
        }

第二步:使最后一行保持颜色不变


        /**
        *使最后一行保持黄色,颜色按个人喜好设置(这里不表示我喜欢"黄色",各位别多想)
        */
        private void KeepYellow(DataGridView dg)
        {
            DataGridViewRow keepYellow = dg.Rows[dg.Rows.Count - 1];//取出最后一行
            keepYellow.ReadOnly = true;//设置此行不可编辑
            keepYellow.DefaultCellStyle.BackColor = System.Drawing.Color.Yellow;//设置行颜色为黄色
        }

第三步:使最后一行不参与排序,需要添加两个事件,CellMouseClick事件和Sorted时间(方法双击事件,自动添加)

 /**
          *功能:最后一行不参与排序
          *日期:2015/3/14
          */
        List<object[]> dataExceptLastRow = new List<object[]>();//List集合存储最后一行
        int currentColumnIndex = 0;//保存当前行的索引
        private void dataGridViewAddTotalRow_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.RowIndex >= 0 || dataGridViewAddTotalRow.Rows.Count == 0)
                return;

            if (dataExceptLastRow.Count == 0)
            {
                currentColumnIndex = e.ColumnIndex;//将当前列赋值给colindex                                                                 
                int index = dataGridViewAddTotalRow.Rows.Count - 1; //排除最后一行                                                                                      dataExceptLastRow.Add(((DataTable)dataGridViewAddTotalRow.DataSource).Rows[index].ItemArray);//将DataTable中所有值添加到List数组,除最后一行(总计行)               dataGridViewAddTotalRow.Rows.Remove(dataGridViewAddTotalRow.Rows[dataGridViewAddTotalRow.Rows.Count - 1]);//从DataTable中输出最后一行(总计行)
                AddTotalRow(dataGridViewAddTotalRow);
            }
        }

        private void dataGridViewAddTotalRow_CellSorted(object sender, EventArgs e)
        {
            if (dataExceptLastRow.Count == 0)
                return;
            DataTable dt = ((DataTable)dataGridViewAddTotalRow.DataSource);//重新绑定数据源
            DataView dv = dt.DefaultView;//因为DataTable没有排序的功能,所有转换成DataView
            dv.Sort = dt.Columns[currentColumnIndex].ColumnName;
            dt = dv.ToTable();//转换成DataTable类型
            dt.Rows.Add(dataExceptLastRow[0]);
            dataExceptLastRow.Clear();
            dataGridViewAddTotalRow.DataSource = dt;
            AddTotalRow(dataGridViewAddTotalRow);
        }

最后,请多多指教!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值