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

来源:互联网 发布:bt下载软件 编辑:程序博客网 时间:2024/06/05 02:55

“众里寻她千百度,蓦然回首,那人却在,灯火阑珊处。”词虽好,但现实比非如此,最近做项目也是碰到了头疼的事,虽然网上关于报表添加总计行的方法很多,但总是让人不知所云,所以自己尝试下这篇博客,我的方法是在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);        }

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

0 0
原创粉丝点击