最近在项目时客户要求datagridview下方有一个统计行,在网上找了好久,都没有找到合适的解决方案,最终自己改写了一个,总算把问题给解决了。废话不多了,现在把源码分享出来。
先看一下效果图。
调用方法
SummaryDataGGrid_InventoryridView.ShowSummary(Grid_Inventory, true, "合计", true, new string[] { "T_Number", "T_Weight", "T_SalePrice" });
参数说明:new string[] { "T_Number", "T_Weight", "T_SalePrice" } 为要统计的字段,ShowSummary()方法的使用可以参考下面的介绍
核心代码
SummaryDataGridView类
<strong>public static class 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
}</strong>
在添加一个组件 ReadOnlyTextBox.cs
public partial class ReadOnlyTextBox : Control
{
StringFormat format;
public ReadOnlyTextBox()
{
InitializeComponent();
format = new StringFormat(StringFormatFlags.NoWrap | StringFormatFlags.FitBlackBox | StringFormatFlags.MeasureTrailingSpaces);
format.LineAlignment = StringAlignment.Center;
this.Height = 10;
this.Width = 10;
this.Padding = new Padding(2);
}
public ReadOnlyTextBox(IContainer container)
{
container.Add(this);
InitializeComponent();
this.TextChanged += new EventHandler(ReadOnlyTextBox_TextChanged);
}
private void ReadOnlyTextBox_TextChanged(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(formatString) && !string.IsNullOrEmpty(Text))
{
Text = string.Format(formatString, Text);
}
}
private Color borderColor = Color.Black;
private bool isSummary;
public bool IsSummary
{
get { return isSummary; }
set { isSummary = value; }
}
private bool isLastColumn;
public bool IsLastColumn
{
get { return isLastColumn; }
set { isLastColumn = value; }
}
private string formatString;
public string FormatString
{
get { return formatString; }
set { formatString = value; }
}
private HorizontalAlignment textAlign = HorizontalAlignment.Left;
[DefaultValue(HorizontalAlignment.Left)]
public HorizontalAlignment TextAlign
{
get { return textAlign; }
set
{
textAlign = value;
setFormatFlags();
}
}
private StringTrimming trimming = StringTrimming.None;
[DefaultValue(StringTrimming.None)]
public StringTrimming Trimming
{
get { return trimming; }
set
{
trimming = value;
setFormatFlags();
}
}
private void setFormatFlags()
{
format.Alignment = TextHelper.TranslateAligment(TextAlign);
format.Trimming = trimming;
}
public Color BorderColor
{
get { return borderColor; }
set { borderColor = value; }
}
protected override void OnPaint(PaintEventArgs e)
{
int subWidth = 0;
Rectangle textBounds;
if (!string.IsNullOrEmpty(formatString) && !string.IsNullOrEmpty(Text))
{
Text = String.Format("{0:" + formatString + "}", Convert.ToDecimal(Text));
}