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