给DataGridView添加底部合计行的一种方法

转载 2007年09月18日 15:14:00

DataGridView是使用很多的控件,可是却没有底部合计行的功能,在做一个小项目时有很多地方要用到,就通过下面的方法实现了这一功能:

把下面  

 #region 添加DataGridView底行合计数 的四个方法  
和  
#endregion  添加DataGridView底行合计数 的四个方法
之间的 代码拷贝到你的程序中

然后再 给要计算合计的 DataGridView 对象(此处假定为dataGridView1) 绑定 下面的方法及 数据表  则可:

这里假设通过点击 按钮 之后 绑定

private void button1_Click(object sender, EventArgs e)
  {

     dataGridView1.DataSourceChanged += new EventHandler(dataGridView_DataSourceChanged);
   dataGridView1.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(dataGridView_ColumnHeaderMouseClick);
   dataGridView1.CellValueChanged += new DataGridViewCellEventHandler(dataGridView_CellValueChanged);
   dataGridView1.AllowUserToAddRows = false;
   dataGridView1.DataSource = 这里是要绑定的数据表;

  }

 

#region 添加DataGridView底行合计数 的四个方法
  /// <summary>
  /// 计算合计算
  /// </summary>
  /// <param name="dgv">要计算的DataGridView</param>
  private void SumDataGridView(DataGridView dgv)
  {

   #region 计算合计数
   //DataGridView dgv = (DataGridView)sender;
   if (dgv.DataSource == null) return;
   DataTable dt = (DataTable)dgv.DataSource;
   if (dt.Rows.Count < 1) return;
   decimal[] tal = new decimal[dt.Columns.Count];

   DataRow ndr = dt.NewRow();

   string talc = "";

   int number = 1;
   foreach (DataRow dr in dt.Rows)
   {
    dr["@xu.Hao"] = number++;
    int n = 0;
    foreach (DataColumn dc in dt.Columns)
    {


     if (talc == "" && dc.DataType.Name.ToUpper().IndexOf("STRING") >= 0) talc = dc.ColumnName;


     if (dc.DataType.IsValueType)
     {
      string hej = dr[dc.ColumnName].ToString();
      try
      {
       if (hej != string.Empty) tal[n] += decimal.Parse(hej);
      }
      catch (Exception) { }
      //if (hej != string.Empty) tal[n] += decimal.Parse(hej);
     }


     n++;
    }
   }

   ndr.BeginEdit();
   for (int i = 0; i < dt.Columns.Count; i++)
   {
    if (tal[i] != 0)
     ndr[i] = tal[i];
   }
   ndr["@xu.Hao"] = ((int)(dt.Rows.Count + 1)).ToString();
   if (talc != "") ndr[talc] = "[合计]";
   ndr.EndEdit();
   dt.Rows.Add(ndr);

   dgv.Rows[dgv.Rows.Count - 1].DefaultCellStyle.BackColor = Color.FromArgb(255, 255, 210);


   if (dgv.Tag == null)
   {
    foreach (DataGridViewColumn dgvc in dgv.Columns)
    {
     dgvc.SortMode = DataGridViewColumnSortMode.Programmatic;
    }
   }


   dgv.Tag = ndr;

   #endregion


  }
  private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
  {//
   //直接拷贝代码

   DataGridView sortDgv = (DataGridView)sender;
   int fx = 0;
   if (sortDgv.AccessibleDescription == null)
   {
    fx = 1;
   }
   else
   {
    fx = int.Parse(sortDgv.AccessibleDescription);
    fx = (fx == 0 ? 1 : 0);
   }
   sortDgv.AccessibleDescription = fx.ToString();
   if (sortDgv.Columns[e.ColumnIndex].Name == "@xu.Hao") return;
   DataGridViewColumn nCol = sortDgv.Columns[e.ColumnIndex];

   if (nCol.DataPropertyName == string.Empty) return;

   if (nCol != null)
   {
    sortDgv.Sort(nCol, fx == 0 ? ListSortDirection.Ascending : ListSortDirection.Descending);

   }
   //--
   DataRow dr = (DataRow)sortDgv.Tag;
   DataTable dt = (DataTable)sortDgv.DataSource;
   DataRow ndr = dt.NewRow();
   ndr.BeginEdit();
   for (int i = 0; i < dt.Columns.Count; i++)
   {
    ndr[i] = dr[i];
   }
   dt.Rows.Remove(dr);


   //if (e.ColumnIndex != 0)
   {
    int n = 1;
    for (int i = 0; i < sortDgv.Rows.Count; i++)
    {
     DataGridViewRow dgRow = sortDgv.Rows[i];
     DataRowView drv = (DataRowView)dgRow.DataBoundItem;
     DataRow tdr = drv.Row;
     tdr.BeginEdit();
     tdr["@xu.Hao"] = n;
     n++;
     tdr.EndEdit();

    }
    sortDgv.Refresh();
    sortDgv.RefreshEdit();

   }
   ndr["@xu.Hao"] = ((int)(dt.Rows.Count + 1)).ToString();
   ndr.EndEdit();
   dt.Rows.Add(ndr);
   sortDgv.Tag = ndr;

   //--
   sortDgv.Sort(sortDgv.Columns["@xu.Hao"], ListSortDirection.Ascending);
   sortDgv.Columns["@xu.Hao"].HeaderCell.SortGlyphDirection = SortOrder.None;
   nCol.HeaderCell.SortGlyphDirection = fx == 0 ? SortOrder.Ascending : SortOrder.Descending;
   sortDgv.Rows[sortDgv.Rows.Count - 1].DefaultCellStyle.BackColor = Color.FromArgb(255, 255, 210);

  }
  private void dataGridView_DataSourceChanged(object sender, EventArgs e)
  {
   DataGridView dgv = (DataGridView)sender;
   DataTable dt = (DataTable)dgv.DataSource;
   if (dt == null) return;
   decimal[] tal = new decimal[dt.Columns.Count];
   if (dt.Columns.IndexOf("@xu.Hao") < 0)
   {
    DataColumn dc = new DataColumn("@xu.Hao", System.Type.GetType("System.Int32"));
    dt.Columns.Add(dc);
    dgv.Columns["@xu.Hao"].DisplayIndex = 0;
    dgv.Columns["@xu.Hao"].HeaderText = "#";

    dgv.Columns["@xu.Hao"].SortMode = DataGridViewColumnSortMode.Programmatic;
    dgv.AutoResizeColumn(dgv.Columns["@xu.Hao"].Index); 

    dgv.Columns["@xu.Hao"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
   }
   SumDataGridView(dgv);
  }
  private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
  {//
   DataGridView dgv = (DataGridView)sender;
   if (dgv.Tag == null || e.RowIndex < 0 || e.RowIndex == dgv.Rows.Count - 1) return;

   string col = dgv.Columns[e.ColumnIndex].DataPropertyName;
   if (col == string.Empty) return;
   if (((DataRowView)dgv.Rows[e.RowIndex].DataBoundItem).Row.Table.Columns[col].DataType.IsValueType)
   {
    decimal tal = 0;
    foreach (DataGridViewRow dgvr in dgv.Rows)
    {
     if (dgvr.Index != dgv.Rows.Count - 1)
     {
      string hej = dgvr.Cells[e.ColumnIndex].Value.ToString();
      if (hej != string.Empty) tal += decimal.Parse(hej);
     }
    }
    if (tal == 0)
     dgv[e.ColumnIndex, dgv.Rows.Count - 1].Value = DBNull.Value;
    else
     dgv[e.ColumnIndex, dgv.Rows.Count - 1].Value = tal;
   }
  }
  #endregion  添加DataGridView底行合计数 的四个方法

 

我在项目中多处运行通过,但不知道通用性如何?!
欢迎交流!

作者:阿Q叔叔 (QQ:123889913)



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1501256

 

遇到给ExtJS页面加一个合计行的问题

遇到给ExtJS页面加一个合计行的问题,在后台代码里添加太麻烦了,这里给大家一个简单的方法。 //合计函数Begin function GridSum(grid) { var sum...
  • zhao19890429
  • zhao19890429
  • 2013年12月11日 20:29
  • 985

DataGridView实现添加合计行并始终显示在底部

DataGridView中没有合适的方法来冻结底部的合计行,这里用一种比较简单的方式实现。 1. 数据部分的DataGridView,不带任何滚动框 2.合计部分的DataGridView,带有横...
  • qq1162195421
  • qq1162195421
  • 2013年08月15日 22:32
  • 3202

GridView添加合计行的实现方案

前提:设置属性ShowFooter="True" 方法一:使用SQL查询统计出合计值,在绑定GridView时让其结果赋于一个DataTable(全局变量),然后在RowDataBound事件中...
  • luohuajiexiejuan
  • luohuajiexiejuan
  • 2015年07月08日 11:53
  • 872

【JqGrid】JqGrid本页合计+总合计(统计)

今天做了个JqGrid本页合计+总合计(统计)的功能,有点吃力,所以在这里汇总纪录一下: 1、先看看效果,页面如下 2、要实现本页合计+总合计,首先需要添加如下代码: 代...
  • zsq520520
  • zsq520520
  • 2016年12月02日 11:42
  • 3774

SQL查询一批数据,怎么在最后一行增加个合计

1.示例 注解:null是rollup产生的汇总项 2.对yf字段进行处理就可以显示“合计” 注解:但是要显示的字段类型必须与yf字段类型一致,若yf是int,就不能显示varchar类型...
  • yu_kang
  • yu_kang
  • 2017年10月24日 16:55
  • 612

Oracle关于Group by合计、小计的使用

方法:group by rollup(col1,col2) group by cube(col1,col2) 具体例子: select G_GOODS_OUT.DEPTID, sum(decod...
  • ceclar123
  • ceclar123
  • 2013年06月06日 15:48
  • 8625

datagrid中添加合计行计算合计

在公司demo项目实习中,我有一个功能是展示所有支出明细后,在下面添加一行合计,计算所有支出明细之和。 首先我想到的是用easyui里datagrid有一个属性showFooter,就是添加...
  • qq_18423547
  • qq_18423547
  • 2016年04月08日 12:06
  • 2215

easyui的datagrid生成合并行,合计计算价格

easyui的datagrid生成合并行,合计计算价格
  • love_xiolan
  • love_xiolan
  • 2016年08月08日 11:12
  • 8621

EAS BOS 报表添加合计行,和每行合计

/** * 添加报表合计行 * @param table  * @param fieldSumList 需要合计列 */ public static void appendFootRow(K...
  • douml88
  • douml88
  • 2014年07月02日 16:00
  • 740

DataGridView实现添加合计行并始终显示在底部

原地址:http://blog.csdn.net/tyouvivi/article/details/1676850 DataGridView中没有合适的方法来冻结底部的合计行,这里用一种比较简单的方...
  • fengjiexyb
  • fengjiexyb
  • 2014年02月26日 12:12
  • 491
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:给DataGridView添加底部合计行的一种方法
举报原因:
原因补充:

(最多只允许输入30个字)