使用方法

/*

DataTable dt= DBUtility.DB.FromSql(sql).ToDataTable();
DataGridViewAddSumRow sumRow = new DataGridViewAddSumRow();
sumRow.Xh_field = "xuhao";
sumRow.DgvName = this.dataGridView1;
sumRow.dataTableName = dt;
sumRow.begin();

*/

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Data;
using System.Drawing;
using System.ComponentModel;

namespace YL.Code
{
public class DataGridViewAddSumRow
{
private DataGridView dgv = null;
private DataTable dt = null;
private string xh_field = "";

public string Xh_field
{
get { return xh_field; }
set { xh_field = value; }
}

public DataGridViewAddSumRow()
{
}
/// <summary>
/// 设置表格的数据源
/// </summary>
public DataTable dataTableName
{
set
{
this.dt = value;
}
}
/// <summary>
///传递表格的名称
/// </summary>
public DataGridView DgvName
{
set
{
dgv = value;
}
}
/// <summary>
/// 开始添加合计行
/// </summary>
public void begin()
{
initDgv();
}
private void initDgv()
{
if (dgv != null)
{

this.dgv.DataSourceChanged += new EventHandler(dataGridView_DataSourceChanged);
this.dgv.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(dataGridView_ColumnHeaderMouseClick);
this.dgv.CellValueChanged += new DataGridViewCellEventHandler(dataGridView_CellValueChanged);
this.dgv.AllowUserToAddRows = false;
dgv.DataSource = dt;
}
}
/// <summary>
/// 计算合计算
/// </summary>
/// <param name="dgv">要计算的DataGridView</param>
private void SumDataGridView(DataGridView dgv)
{
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[xh_field] = 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[xh_field] = ((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, 222, 210);
dgv.Rows[dgv.Rows.Count - 1].ReadOnly = true;

if (dgv.Tag == null)
{
foreach (DataGridViewColumn dgvc in dgv.Columns)
{
dgvc.SortMode = DataGridViewColumnSortMode.Programmatic;
}
}
dgv.Tag = ndr;
}
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 == xh_field) 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[xh_field] = n;
n++;
tdr.EndEdit();

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

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

//--
sortDgv.Sort(sortDgv.Columns[xh_field], ListSortDirection.Ascending);
sortDgv.Columns[xh_field].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(xh_field) < 0)
{
DataColumn dc = new DataColumn(xh_field, System.Type.GetType("System.Int32"));
dt.Columns.Add(dc);

dgv.Columns[xh_field].DisplayIndex = 0;
dgv.Columns[xh_field].HeaderText = "序号";

dgv.Columns[xh_field].SortMode = DataGridViewColumnSortMode.Programmatic;
dgv.AutoResizeColumn(dgv.Columns[xh_field].Index);

dgv.Columns[xh_field].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
dgv.Columns[xh_field].Visible = true;
}
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;
}
}

}
}

winform DataGridView添加合计行的更多相关文章

  1. KDTable如何添加合计行?

    /** * 功能:添加合计行 * * @param table * 指定的KDTable * @param fields * 需要合计的列 */ public static void apendFoo ...

  2. C# DataGridView添加新行的2个方法

    可以静态绑定数据源,这样就自动为DataGridView控件添加 相应的行.假如需要动态为DataGridView控件添加新行,方法有很多种,下面简单介绍如何为DataGridView控件动态添加新行 ...

  3. Winform DataGridView添加列头checkbox

    using System; using System.Data; using System.Drawing; using System.Windows.Forms; using Yanwen.Logi ...

  4. Gridview里添加合计行

    ShowFooter="true" ; ; ; protected void gvIncomeYG_RowDataBound(object sender, GridViewRowE ...

  5. jqGrid 添加 合计行 footDate

    jQuery(table_id).jqGrid({ url : url,//组件创建完成之后请求数据的url datatype : "json",//请求数据返回的类型.可选jso ...

  6. 分享一个带有合计行功能的DataGridView扩展

    因为一个Winform的项目中需要用到带有合计行的表格,并且需要满足以下需求: 合计行可自动对需要求和的列进行求和计算; 合计行必须固定(冻结)在表格的最底部,且其位置不受滚动条的滚动而移动; 可以设 ...

  7. C#给DataTable添加序号、C#给DataTable添加合计、小计

    /// <summary>        /// 给DataTable添加序号        /// </summary>        /// <param name= ...

  8. FineUI大版本升级,外置ExtJS库、去AXD化、表格合计行、表格可编辑单元格的增删改、顶部菜单框架

    这是一篇很长的文章,在开始正文之前,请允许我代表目前排名前 20 中唯一的 .Net 开源软件 FineUI 拉下选票: 投票地址: https://code.csdn.net/2013OSSurve ...

  9. Winform中的dataGridView添加自动编号

    1.Winform中的dataGridView添加自动编号:http://blog.csdn.net/ohyoyo2014/article/details/38346887 2.如何为datagrid ...

随机推荐

  1. CentOs7 修复 引导启动

    一.修复MBR: MBR(Master Boot Record主引导记录): 硬盘的0柱面.0磁头.1扇区称为主引导扇区.其中446Byte是bootloader,64Byte为Partition t ...

  2. X86/X64 函数调用约定

    C 语言有 __cdecl.__stdcall.__fastcall.naked.__pascal. C++ 语言有 __cdecl.__stdcall.__fastcall.naked.__pasc ...

  3. byte[] 中需要除去的特定 byte

    /// <summary> /// 去掉byte[]中特定的byte /// </summary> /// <param name="SourceByteArr ...

  4. 真实场景中WebRTC 用到的服务 STUN, TURN 和 signaling

    FQ收录转自:WebRTC in the real world: STUN, TURN and signaling WebRTC enables peer to peer communication. ...

  5. [转]iOS开发总结之代码规范

    转自:http://www.cocoachina.com/ios/20151014/13678.html 命名规范 总 的来说, iOS命名两大原则是:可读性高和防止命名冲突(通过加前缀来保证). O ...

  6. linux 命令——46 vmstat(转)

    vmstat 是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个进程进行 ...

  7. C语言标准库之setjmp

    协程的介绍 协程(coroutine),意思就是“协作的例程”(co-operative routines),最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程 ...

  8. World Wind Java开发之十三——加载Geoserver发布的WMS服务(转)

    这篇是转载的平常心博客,原地址见:http://www.v5cn.cn/?p=171 1.WMSTiledImageLayer类说明 一个WMSTiledImageLayer类对象只能对应一个WMS发 ...

  9. 第十五篇、OC_同一个View实现两个手势响应

    #pragma mark-UIGestureRecognizerDelegate Methods // 只要实现这个方法,就可以实现两个手势同时响应 - (BOOL)gestureRecognizer ...

  10. 博学谷-数据分析pandas

    import pandas as pd df=pd.read_csv() df=pd.read_sql()