最近在项目时客户要求datagridview下方有一个统计行,在网上找了好久,都没有找到合适的解决方案,最终自己改写了一个,总算把问题给解决了。废话不多了,现在把源码分享出来。
先看一下效果图。
调用方法:
<span style="font-size:14px;"> SummaryDataGridView.ShowSummary(Grid_Inventory, true, "合计", true, new string[] { "T_Number", "T_Weight", "T_SalePrice" });</span>
说明:
<span style="font-size:14px;"><strong>new string[] { "T_Number", "T_Weight", "T_SalePrice" } 为要统计列的字段,方法在窗体构造函数中。</strong></span>
核心代码:
SummaryDataGridView 类 代码如下
#region 显示统计列
/// <summary>
/// 显示DataGridView的统计信息
/// </summary>
/// <param name="dgv"></param>
/// <param name="SummaryColumns">要统计的列名称或数据源绑定列名称</param>
public static void ShowSummary(this DataGridView dgv, string[] SummaryColumns)
{
SummaryControlContainer summaryControl = new SummaryControlContainer(dgv, SummaryColumns);
dgv.Controls.Add(summaryControl);
//dgv.Tag = summaryControl;
summaryControl.BringToFront();
summaryControl.Show();
}
/// <summary>
/// 显示DataGridView的统计信息
/// </summary>
/// <param name="dgv"></param>
/// <param name="DisplaySumRowHeader">是否显示合计行标题</param>
/// <param name="SumRowHeaderText">合计列标题</param>
/// <param name="SumRowHeaderTextBold">合计列标题用粗体显示</param>
/// <param name="SummaryColumns">要统计的列名称或数据源绑定列名称</param>
public static void ShowSummary( this DataGridView dgv, bool DisplaySumRowHeader, string SumRowHeaderText, bool SumRowHeaderTextBold, string[] SummaryColumns)
{
SummaryControlContainer summaryControl = new SummaryControlContainer(dgv, DisplaySumRowHeader, SumRowHeaderText, SumRowHeaderTextBold, SummaryColumns);
dgv.Controls.Add(summaryControl);
//dgv.Tag = summaryControl;
summaryControl.BringToFront();
summaryControl.Show();
}
#endregion
添加一个用户控件SummaryControlContainer.cs代码如下:
public partial class SummaryControlContainer : UserControl
{
#region 公有属性
private bool _DisplaySumRowHeader;
/// <summary>
/// 是否显示合计行标题
/// </summary>
public bool DisplaySumRowHeader
{
get { return _DisplaySumRowHeader; }
set { _DisplaySumRowHeader = value; }
}
private string _SumRowHeaderText = "合计";
/// <summary>
/// 合计列标题
/// </summary>
public string SumRowHeaderText
{
get
{
if (_DisplaySumRowHeader)
{
return _SumRowHeaderText;
}
else
{
return string.Empty;
}
}
set
{
if (string.IsNullOrEmpty(value))
{
_SumRowHeaderText = "合计";
}
else
{
_SumRowHeaderText = value;
}
}
}
private bool _SumRowHeaderTextBold;
/// <summary>
/// 合计列标题用粗体显示
/// </summary>
public bool SumRowHeaderTextBold
{
get { return _SumRowHeaderTextBold; }
set { _SumRowHeaderTextBold = value; }
}
private string[] _SummaryColumns;
/// <summary>
/// 要统计的列名称或数据源绑定列名称
/// </summary>
public string[] SummaryColumns
{
get { return _SummaryColumns; }
set
{
_SummaryColumns = value;
}
}
private string _FormatString = "F02";
public string FormatString
{
get { return _FormatString; }
set { _FormatString = value; }
}
#endregion
#region 私有变量
private Hashtable sumBoxHash;
private DataGridView dgv;
private Label sumRowHeaderLabel;
#endregion
#region 构造函数
public SummaryControlContainer(DataGridView dgv, string[] summaryColumns)
: this(dgv, true, "合计", false, summaryColumns)
{
}
public SummaryControlContainer(DataGridView dgv, bool displaySumRowHeader, string sumRowHeaderText,
bool sumRowHeaderTextBold, string[] summaryColumns)
{
if (dgv == null)
{
throw new Exception("DataGridView 不能为空!");
}
this.dgv = dgv;
_DisplaySumRowHeader = displaySumRowHeader;
_SumRowHeaderText = sumRowHeaderText;
_SumRowHeaderTextBold = sumRowHeaderTextBold;
_SummaryColumns = summaryColumns;
this.Visible = true;
this.Height &#