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

winfrom datagridview下方显示统计列 在做winfrom项目的时候经常会遇到 阅读详情

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底行合计数 的四个方法

 
C# DataGridView合计完整解决方法 在网络上看过很多关于DataGridView合计的设计及源码,搜到了很多相同的文章(都是相互复制),一点创新都没有。 普遍存在的问题是用户体现不,或存在很多BUG等。。 很多的人写的解决办法如下几条: 把D... 阅读详情

相关推荐

datagridview添加合计(二)

 合计时效果如下:平均值时的效果:文字显示时的效果:因为一些原因源代码不能完全公布,所以这里只谈下实现思路:因为datagridview控件本身没有自动合计的功能,而在每次绑定时向网格底部插入一空实现合计的办法既不方便又不灵活,而且不能达到时刻可以看到合计的效果,必须每次都手动拖动滚动条到底端来看,所以这种实现办法不够理想.就想了以下一种方法来实现.用一个PANEL和一个

wudi626的专栏 3191

C# DataGridView 添加合计简单代码

网上一些增加合计的代码太复杂,自己写了一个简单的

DataGridView多层表头与底部合计的实现

htmltable {th, td {th {pre {简介:在.NET框架的DataGridView控件中,实现多层表头和底部合计可以增强数据展示功能,让用户更好地理解和分析表格数据。多层表头适用于复杂数据结构的展示,而底部合计提供数据汇总,如求和、平均值等统计信息。通过编程设置和格式化属性,开发者可以创建多层表头并计算显示底部合计。本实例提供了使用C#或VB.NET创建这些特性的详细步骤,并讨论了优化和扩展的可能性,例如动态计算合计和考虑性能问题。

weixin_42515340的博客 781

c# datagridview 合计

c# datagridview 合计 在最底增加合计合计不会随滚动条拉动而移动

C# DataGridView添加合计

C# DataGridView添加合计   string strcon = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=employee;Data Source=(local)";             string strsql="select * from class";

sadleaflzh的专栏 3804

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

DataGridView中没有合适的方法来冻结底部合计,这里用一种比较简单的方式实现。1. 数据部分的DataGridView,不带任何滚动框2.合计部分的DataGridView,带有横向滚动框3.在画面上添加一个纵向滚动框实现的主要思路就是用合计的横向滚动框控制两个DataGridView的横向滚动,右侧的纵向滚动狂控制数据部分的DataGridView,效果看起来就是合计始终显示。该

tyouvivi的专栏 4万+

DataGridView添加底部合计一种方法[转载]

 DataGridView是使用很多的控件,可是却没有底部合计的功能,在做一个小项目时有很多地方要用到,就通过下面的方法实现了这一功能:把下面  #region 添加DataGridView合计数 的四个方法   和  #endregion   添加DataGridView合计数 的四个方法之间的 代码拷贝到你的程序中然后再 给要计算合计DataGridView 对象

lovegod12的专栏 886

datagridview添加合计

导读:   在给朋友做的一个软件中用到datagridview添加一行合计的问题,个人认为用sql在数据集中直接添加然后直接读入datagridview方法比较好,以下是从网上找到一些解决方法,抄袭。:)   DataGridView是使用很多的控件,可是却没有底部合计的功能,在做一个小项目时有很多地方要用到,就通过下面的方法实现了这一功能:   把下面   #region 添加

乞无知的专栏 2560

datagridview实现汇总简单方法

vb.net中datagridview实现对汇总字段的合计功能,当datagridview中需要汇总的单元格内容改变时,自动进汇总,更改合计的内容。

datagridview添加合计(一)

DataGridView是使用很多的控件,可是却没有底部合计的功能,在做一个小项目时有很多地方要用到,就通过下面的方法实现了这一功能:把下面   #region 添加DataGridView合计数 的四个方法   和  #endregion  添加DataGridView合计数 的四个方法之间的 代码拷贝到你的程序中然后再 给要计算合计DataGridView 对象(此处

wudi626的专栏 2132

C# DataGridView合计

在网上搜了很多关于DataGridView合计的设计及源码,都不是很合我心意。于是自己写了一个关于合计的DLL。以后每次要用到合计的时候只要引用这个DLL就可以了。 效果图如下: 引用Dll: 附上例子源码: namespace WindowsFormsApplication1 { public partia...

dengtai4781的博客 1371

winform DataGridView添加合计

使用方法 /* DataTable dt= DBUtility.DB.FromSql(sql).ToDataTable(); DataGridViewAddSumRow sumRow = new DataGridViewAddSumRow(); sumRow.Xh_field = "xuha...

639

DataGridView添加底部合计一种方法

DataGridView是使用很多的控件,可是却没有底部合计的功能,在做一个小项目时有很多地方要用到,就通过下面的方法实现了这一功能:把下面   #region 添加DataGridView合计数 的四个方法   和  #endregion  添加DataGridView合计数 的四个方法之间的 代码拷贝到你的程序中然后再 给要计算合计DataGridView 对象(此处

脑瓜子的程序人生 2061
上一篇: 3.3 生产管理系统需求分析
下一篇: DataGrid中点击超级链接列后,如何控制弹出窗口????/(MENGZI)
jackeyabc
博客等级 码龄20年 71粉丝 297原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值