Winform设计时,怎样给DataGridView加合计行!!!

源码下载:http://download.csdn.net/source/2370318

在给DataGridView加合计行时,应先考虑怎样把合计行置入DataGridView,让行和DataGridView看起来像一个整体。我这里继承了DataGridView.

首先,创建个下Panel实例_SummaryContainer,并将Panel的实例位置定为:

 

            if (this.HorizontalScrollBar.Visible)

            {

                this._SummaryContainer.Top = this.Height - (this.RowTemplate.Height - 1) - this.HorizontalScrollBar.Height - 1;

            }

            else

            {

                this._SummaryContainer.Top = this.Height - (this.RowTemplate.Height - 1)- 1;

            }

上面的代码定义了合计行_SummaryContaine的位置,接下来,将创建每列对应的合计标签,我这里写了SummaryTextBox类,它有IsSummary(是否是可合计),IsHeaderLabel(是否是合计头标签),并将SummaryTextBox实例Name设置为对应列的Name或DataPropertyName。计算时,只要遍历_SummaryContaine中所有控件,并根据遍历的每个控件查找所有列中对应的列,然后计算列的合计。
展示的程序,提供了两个关键属性: SummaryColumns, SummaryHeaderText
        /// <summary>
        /// 统计列,要求设置为要统计Column的Name或DataPropertyName
        /// </summary>
        private string[] _SummaryColumns;
        [Browsable(true), Category("Summary")]
        public string[] SummaryColumns
        {
            get { return _SummaryColumns; }
            set
            {
                _SummaryColumns = value;
                this._SummaryTextHashTable.Clear();
                this._SummaryContainer.Controls.Clear();
                this.RefreshSummaryTextBoxCache();
                this.AdjustSummaryTextBoxWidth();
                this.ShowSummaryTextInfo();
            }
        }
        /// <summary>
        /// 统计文本标题
        /// </summary>
        private string _SummaryHeaderText;
        [Browsable(true), Category("Summary")]
        public string SummaryHeaderText
        {
            get { return _SummaryHeaderText; }
            set
            {
                _SummaryHeaderText = value;
            }
        }
下面是源代码:
DataGridViewSummary.cs

 

 

using System;

using System.ComponentModel;

using System.Collections;

using System.Collections.Generic;

using System.Diagnostics;

using System.Text;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Drawing.Imaging;

using System.Windows.Forms;

 

namespace Ruijc.UI.DataGridViewEx

{

    //文件        : DataGridViewSummary.cs

    //描述        : 扩展DataGridView且具有数据统计及键盘快捷操作功能

    //创建人      : Ruijc

    //创建时间    : 2010年05月12日

    //最后修改人  :(无)

    //最后修改时间:(无)

    //版权所有 (C):(无)

    public partial class DataGridViewSummary : DataGridView

    {

        /// <summary>

        /// 合计文本窗口

        /// </summary>

        private Panel _SummaryContainer = new Panel();

        /// <summary>

        /// 合计行头标签

        /// </summary>

        private SummaryTextBox _SummaryRowHeaderLabel = new SummaryTextBox();

 

        /// <summary>

        /// 缓存统计文本框控件

        /// </summary>

        private Hashtable _SummaryTextHashTable = new Hashtable();

        private SummaryTextType _FirstColSumTextType = SummaryTextType.None;

 

        /// <summary>

        /// 合计文本类型

        /// </summary>

        private enum SummaryTextType

        {

            Number,

            Text,

            None

        }

 

        #region 可设计属性

 

        /// <summary>

        /// 统计文本标题

        /// </summary>

        private string _SummaryHeaderText;

        [Browsable(true), Category("Summary")]

        public string SummaryHeaderText

        {

            get { return _SummaryHeaderText; }

            set

            {

                _SummaryHeaderText = value;

            }

        }

 

        /// <summary>

        /// 是否显示统计行

        /// </summary>

        private bool _SummaryRowVisible = true;

        [Browsable(true), Category("Summary")]

        public bool SummaryRowVisible

        {

            get { return _SummaryRowVisible; }

            set

            {

                _SummaryRowVisible = value;

                if (this._SummaryContainer != null)

                {

                    _SummaryContainer.Visible = value;

                }

            }

        }

 

        /// <summary>

        /// 统计行背景色

        /// </summary>

        private Color _SummaryRowBackColor = Color.White;

        [Browsable(true), Category("Summary")]

        public Color SummaryRowBackColor

        {

            get

            {

                if (_SummaryRowBackColor == Color.White)

                    return this.GridColor;

                return _SummaryRowBackColor;

            }

            set

            {

                _SummaryRowBackColor = value;

            }

        }

 

        /// <summary>

        /// 统计行字体色

        /// </summary>

        private Color _SummaryRowForeColor = Color.Blue;

        [Browsable(true), Category("Summary")]

        public Color SummaryRowForeColor

        {

            get

            {

                return _SummaryRowForeColor;

            }

            set

            {

                _SummaryRowForeColor = value;

            }

        }

        /// <summary>

        ///统计文本粗体字

        /// </summary>

        private bool _SummaryHeaderBold;

        [Browsable(true), Category("Summary")]

        public bool SummaryHeaderBold

        {

            get { return _SummaryHeaderBold; }

            set { _SummaryHeaderBold = value; }

        }

 

        /// <summary>

        /// 统计列,要求设置为要统计Column的Name或DataPropertyName

        /// </summary>

        private string[] _SummaryColumns;

        [Browsable(true), Category("Summary")]

        public string[] SummaryColumns

        {

            get { return _SummaryColumns; }

            set

            {

                _SummaryColumns = value;

                this._SummaryTextHashTable.Clear();

                this._SummaryContainer.Controls.Clear();

                this.RefreshSummaryTextBoxCache();

                this.AdjustSummaryTextBoxWidth();

                this.ShowSummaryTextInfo();

            }

        }

 

        /// <summary>

        /// 表格数据列

        /// </summary>

        private Dictionary<string, DataGridViewColumn> GridViewColumns

        {

            get

            {

                Dictionary<string, DataGridViewColumn> result = new Dictionary<string, DataGridViewColumn>();

                DataGridViewColumn column = this.Columns.GetFirstColumn(DataGridViewElementStates.None);

                if (column == null || column.Name.Trim() == "")

                    return result;

                result.Add(column.Name, column);

                while ((column = this.Columns.GetNextColumn(column, DataGridViewElementStates.None, DataGridViewElementStates.None)) != null)

                {

                    if (column.Visible == false) continue;

                    if (!result.ContainsKey(column.Name) && column.Name.Trim() != "")

                        result.Add(column.Name, column);

                }

                return result;

            }

        }

 

        private void RefreshSummaryTextBoxCache()

        {

            if (this._SummaryColumns == null || this._SummaryColumns.Length == 0)

            {

                this._SummaryContainer.Visible = false;

                return;

            }

            this._SummaryContainer.Visible = this._SummaryRowVisible;

            //统计列

            for (int i = 0; i < this._SummaryColumns.Length; i++)

            {

                if (this.GridViewColumns.ContainsKey(_SummaryColumns[i]))

                {

                    SummaryTextBox sumTextBox = new SummaryTextBox();

                    DataGridViewColumn currCol = this.GridViewColumns[_SummaryColumns[i]];

                    sumTextBox.Name = currCol.DataPropertyName.Trim() == "" ? currCol.Name : currCol.DataPropertyName;

                    sumTextBox.IsSummary = true;

                    sumTextBox.IsHeaderLabel = false;

                    if (!this._SummaryTextHashTable.ContainsKey(currCol))

                        this._SummaryTextHashTable.Add(currCol, sumTextBox);

                    if (currCol.DisplayIndex == 0)

                        _FirstColSumTextType = SummaryTextType.Number;

                }

            }

 

            //非统计列

            foreach (DataGridViewColumn currCol in this.GridViewColumns.Values)

            {

                if (!_SummaryTextHashTable.ContainsKey(currCol))

                {

                    SummaryTextBox sumTextBox = new SummaryTextBox();

                    sumTextBox.Name = currCol.DataPropertyName.Trim() == "" ? currCol.Name : currCol.DataPropertyName;

                    sumTextBox.IsSummary = false;

                    sumTextBox.IsHeaderLabel = false;

                    this._SummaryTextHashTable.Add(currCol, sumTextBox);

                }

            }

 

            foreach (DataGridViewColumn currCol in this.GridViewColumns.Values)

            {

                if (_FirstColSumTextType == SummaryTextType.None)

                {

                    //取得当前列的下一列

                    DataGridViewColumn NextCol = this.Columns.GetNextColumn(currCol, DataGridViewElementStates.None, DataGridViewElementStates.None);

                    if (NextCol == null) break;

                    if (NextCol.Name.Trim() == "") continue;

                    SummaryTextBox nextSumTextBox = this._SummaryTextHashTable[NextCol] as SummaryTextBox;

                    SummaryTextBox currSumTextBox = this._SummaryTextHashTable[currCol] as SummaryTextBox;

                    currSumTextBox.Name = currCol.DataPropertyName.Trim() == "" ? currCol.Name : currCol.DataPropertyName;

 

                    //如果下一列对应是SummaryTextBox实例是合计,且第一列不是头列时设置第一列为头列类型

                    if (nextSumTextBox.IsSummary && _FirstColSumTextType != SummaryTextType.Text)

                    {

                        currSumTextBox.IsHeaderLabel = true;

                        currSumTextBox.IsSummary = false;

                        currSumTextBox.Visible = true;

                        _FirstColSumTextType = SummaryTextType.Text;

                    }

                    else

                    {

                        currSumTextBox.IsHeaderLabel = false;

                        currSumTextBox.IsSummary = false;

                        currSumTextBox.Visible = false;

                    }

                }

            }

        }

 

        #endregion

 

        #region 构造函数

        public DataGridViewSummary()

        {

            this._SummaryContainer.AutoSize = false;

            this._SummaryContainer.BorderStyle = this.BorderStyle;

            this._SummaryContainer.Height = this.RowTemplate.Height - 1;

            this._SummaryContainer.Padding = new Padding(0);

            this._SummaryContainer.Margin = new Padding(0);

 

            //加入统计区域,并能过OnPaint(PaintEventArgs e)调整统计区域位置

            this.Controls.Add(this._SummaryContainer);

            //垂直滚动条改变

            this.VerticalScrollBar.VisibleChanged += new EventHandler(VerticalScrollBar_VisibleChanged);

            //表格尺寸改变

            this.Resize += new EventHandler(DataGridViewSummary_Resize);

            //单元格值改变

            this.CellValueChanged += new DataGridViewCellEventHandler(DataGridViewSummary_CellValueChanged);

            //单元格验证完成

            this.CellValidated += new DataGridViewCellEventHandler(DataGridViewSummary_CellValidated);

            //列显示顺序改变

            this.ColumnDisplayIndexChanged += new DataGridViewColumnEventHandler(DataGridViewSummary_ColumnDisplayIndexChanged);

            //列宽改变

            this.ColumnWidthChanged += new DataGridViewColumnEventHandler(DataGridViewSummary_ColumnWidthChanged);

            //添加列

            this.ColumnAdded += new DataGridViewColumnEventHandler(DataGridViewSummary_ColumnAdded);

            //移除列

            this.ColumnRemoved += new DataGridViewColumnEventHandler(DataGridViewSummary_ColumnRemoved);

            //数据源改变

            this.DataSourceChanged += new EventHandler(DataGridViewSummary_DataSourceChanged);

            //数据输入错误

            this.DataError += new DataGridViewDataErrorEventHandler(DataGridViewSummary_DataError);

            //数据绑定完成

            this.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(DataGridViewSummary_DataBindingComplete);

        }

 

        #endregion

 

        #region 事件处理

        void DataGridViewSummary_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)

        {

            this.ResetSummaryContainer();

        }

 

        void DataGridViewSummary_DataError(object sender, DataGridViewDataErrorEventArgs e)

        {

            if (e.RowIndex == -1) return;

            this.Rows[e.RowIndex].ErrorText = "输入数据不正确!";

            e.Cancel = true;

        }

 

        void DataGridViewSummary_DataSourceChanged(object sender, EventArgs e)

        {

            this.ResetSummaryContainer();

        }

 

        void DataGridViewSummary_CellValidated(object sender, DataGridViewCellEventArgs e)

        {

            if (e.RowIndex == -1) return;

            this.Rows[e.RowIndex].ErrorText = "";

        }

 

        void DataGridViewSummary_CellValueChanged(object sender, DataGridViewCellEventArgs e)

        {

            this.ShowSummaryTextInfo();

        }

 

        void DataGridViewSummary_ColumnRemoved(object sender, DataGridViewColumnEventArgs e)

        {

            this._SummaryTextHashTable.Clear();

            this._SummaryContainer.Controls.Clear();

            this.ResetSummaryContainer();

        }

 

        void DataGridViewSummary_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e)

        {

            this._SummaryTextHashTable.Clear();

            this._SummaryContainer.Controls.Clear();

            this.ResetSummaryContainer();

        }

 

        void DataGridViewSummary_ColumnAdded(object sender, DataGridViewColumnEventArgs e)

        {

            this._SummaryTextHashTable.Clear();

            this._SummaryContainer.Controls.Clear();

            this.ResetSummaryContainer();

        }

 

        void DataGridViewSummary_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)

        {

            this.ResetSummaryContainer();

        }

 

        private void DataGridViewSummary_Resize(object sender, EventArgs e)

        {

            this.ResetSummaryContainer();

        }

 

        void VerticalScrollBar_VisibleChanged(object sender, EventArgs e)

        {

            if (this.VerticalScrollBar.Visible)

            {

                this.VerticalScrollBar.SmallChange = this.RowTemplate.Height * 2;

            }

        }

        #endregion

 

        #region 应用处理

        /// <summary>

        /// 设置统计区域大小、位置,并构建统计

        /// </summary>

        private void ResetSummaryContainer()

        {

            this.RefreshSummaryTextBoxCache();

 

            int realHeight = this._SummaryContainer.Height;

 

            if (this.HorizontalScrollBar.Visible)

            {

                this._SummaryContainer.Top = this.Height - realHeight - this.HorizontalScrollBar.Height - 1;

            }

            else

            {

                this._SummaryContainer.Top = this.Height - realHeight - 1;

            }

            this._SummaryRowHeaderLabel.Name = "RowsHeader_Label";

            this._SummaryRowHeaderLabel.IsHeaderLabel = true;

            this._SummaryRowHeaderLabel.Text = "√";

            this._SummaryRowHeaderLabel.Top = 0;

            this._SummaryRowHeaderLabel.Left = 0;

            this._SummaryRowHeaderLabel.BorderColor = this.GridColor;

            this._SummaryRowHeaderLabel.Height = this.RowTemplate.Height;

            this._SummaryRowHeaderLabel.Width = this.RowHeadersWidth;

            if (!this._SummaryContainer.Controls.ContainsKey("RowsHeader_Label"))

                this._SummaryContainer.Controls.Add(this._SummaryRowHeaderLabel);

 

            this._SummaryContainer.Left = 0;

            this._SummaryContainer.Width = CalcSummaryContainerWidth();

            this._SummaryContainer.Invalidate();

            //调整统计项SummaryTextBox尺寸

            this.AdjustSummaryTextBoxWidth();

            //显示最终计算结果

            this.ShowSummaryTextInfo();

        }

 

        /// <summary>

        /// 调整统计项SummaryTextBox尺寸

        /// </summary>

        private void AdjustSummaryTextBoxWidth()

        {

            int rowHeaderWidth = this.RowHeadersVisible ? this.RowHeadersWidth - 1 : 0;

            int curPos = rowHeaderWidth;

            int labelWidth = 0;

            foreach (DataGridViewColumn col in this.GridViewColumns.Values)

            {

                SummaryTextBox sumTextBox = (SummaryTextBox)this._SummaryTextHashTable[col];

                if (sumTextBox == null) continue;

                //计算统计头文本宽度

                if (!sumTextBox.Visible)

                {

                    labelWidth += col.Width;

                    continue;

                }

 

                sumTextBox.BorderColor = this.GridColor;

                sumTextBox.BackColor = this._SummaryRowBackColor;

 

                if (!col.Visible)

                {

                    sumTextBox.Visible = false;

                    continue;

                }

                int startX = curPos;

                if (this.HorizontalScrollBar.Visible)

                    startX = curPos - this.HorizontalScrollingOffset;

 

                int currWidth = col.Width;

                if (sumTextBox.IsHeaderLabel)

                    currWidth = labelWidth + col.Width;

 

                if (startX < rowHeaderWidth)

                {

                    currWidth -= rowHeaderWidth - startX;

                    startX = rowHeaderWidth;

                }

 

                if (startX + currWidth > this.Width)

                    currWidth = this.Width - startX;

 

                if (this.RightToLeft == RightToLeft.Yes)

                    startX = this.Width - startX - currWidth;

 

                if (sumTextBox.Left != startX || sumTextBox.Width != currWidth)

                {

                    sumTextBox.SetBounds(startX, 0, currWidth + 1, this.RowTemplate.Height);

                    sumTextBox.BorderColor = this.GridColor;

                    sumTextBox.Visible = true;

                    if (this._SummaryContainer.Controls.ContainsKey(sumTextBox.Name))

                    {

                        SummaryTextBox originalTextBox = this._SummaryContainer.Controls[sumTextBox.Name] as SummaryTextBox;

                        originalTextBox.SetBounds(startX, 0, currWidth + 1, this.RowTemplate.Height);

                        originalTextBox.Invalidate();

                        originalTextBox.BringToFront();

                    }

                    else

                    {

                        this._SummaryContainer.Controls.Add(sumTextBox);

                    }

                    sumTextBox.BringToFront();

                }

                if (sumTextBox.IsHeaderLabel)

                {

                    curPos += labelWidth + col.Width;

                }

                else

                {

                    curPos += col.Width;

                }

                sumTextBox.Invalidate();

            }

            this._SummaryContainer.Refresh();

        }

 

        /// <summary>

        /// 计算统计控件的宽度

        /// </summary>

        /// <returns></returns>

        private int CalcSummaryContainerWidth()

        {

            int columnWidth = this.RowHeadersVisible ? this.RowHeadersWidth : 1;

            foreach (DataGridViewColumn col in this.GridViewColumns.Values)

            {

                if (col.AutoSizeMode == DataGridViewAutoSizeColumnMode.Fill)

                {

                    columnWidth += col.MinimumWidth;

                }

                else

                    columnWidth += col.Width;

            }

            if (columnWidth == 0)

                columnWidth = this.Width;

            return columnWidth;

        }

 

        /// <summary>

        /// 是否是整形

        /// </summary>

        /// <param name="o">对象</param>

        /// <returns>true 或 false</returns>

        protected bool IsInteger(object o)

        {

            bool IsInt = false;

            if (o is Int64)

                IsInt = true;

            if (o is Int32)

                IsInt = true;

            if (o is Int16)

                IsInt = true;

            return IsInt;

        }

 

        /// <summary>

        /// 是否是小数点型

        /// </summary>

        /// <param name="o">对象</param>

        /// <returns>true 或 false</returns>

        protected bool IsDecimal(object o)

        {

            bool IsDec = false;

            if (o is Decimal)

                IsDec = true;

            if (o is Single)

                IsDec = true;

            if (o is Double)

                IsDec = true;

            return IsDec;

        }

 

        /// <summary>

        /// 列合计计算

        /// </summary>

        /// <param name="col"></param>

        /// <returns></returns>

        private string CalcSum(DataGridViewColumn col)

        {

            SummaryTextBox sumTextBox = this._SummaryTextHashTable[col] as SummaryTextBox;

            object valObj = sumTextBox.Tag;

            foreach (DataGridViewRow dgvRow in this.Rows)

            {

                if (this._SummaryTextHashTable.ContainsKey(col))

                {

                    if (sumTextBox != null && sumTextBox.IsSummary)

                    {

                        if (valObj == null)

                            valObj = 0;

                        if (dgvRow.Cells[col.Index].Value != null

                            && !(dgvRow.Cells[col.Index].Value is DBNull))

                        {

                            if (IsInteger(dgvRow.Cells[col.Index].Value))

                            {

                                valObj = Convert.ToInt64(valObj) + Convert.ToInt64(dgvRow.Cells[col.Index].Value == null || dgvRow.Cells[col.Index].Value.ToString() == "" ? 0 : dgvRow.Cells[col.Index].Value);

                            }

                            else if (IsDecimal(dgvRow.Cells[col.Index].Value))

                            {

                                valObj = Convert.ToDecimal(valObj) + Convert.ToDecimal(dgvRow.Cells[col.Index].Value == null || dgvRow.Cells[col.Index].Value.ToString() == "" ? 0 : dgvRow.Cells[col.Index].Value);

                            }

                        }

                    }

                }

            }

            return string.Format("{0}", valObj);

        }

 

        /// <summary>

        /// 显示统计信息

        /// </summary>

        private void ShowSummaryTextInfo()

        {

            int icnt = this._SummaryContainer.Controls.Count;

            _FirstColSumTextType = SummaryTextType.None;

            foreach (Control ctr in this._SummaryContainer.Controls)

            {

                SummaryTextBox sumTextBox = ctr as SummaryTextBox;

                if (sumTextBox == null)

                    continue;

                if (sumTextBox.Name == "RowsHeader_Label")

                    continue;

 

                DataGridViewColumn currCell = this.GridViewColumns[sumTextBox.Name];

                if (currCell == null) continue;

                sumTextBox.ForeColor = this._SummaryRowForeColor;

                sumTextBox.BackColor = this._SummaryRowBackColor;

                if (sumTextBox.IsHeaderLabel)

                {//如果SummaryTextBox的IsHeaderLabel为true则显示统计标题文本

                    sumTextBox.Text = this._SummaryHeaderText;

                    sumTextBox.TextAlign = HorizontalAlignment.Center;

                    sumTextBox.Font = new Font(this.DefaultCellStyle.Font, this._SummaryHeaderBold ? FontStyle.Bold : FontStyle.Regular);

                    _FirstColSumTextType = SummaryTextType.Text;

                    sumTextBox.Invalidate();

                    continue;

                }

                if (sumTextBox.IsSummary)

                {//如果是SummaryTextBox的IsSummary为true则计算对应列的合计

                    sumTextBox.Text = this.CalcSum(currCell);

                    sumTextBox.FormatString = currCell.DefaultCellStyle.Format;

                    sumTextBox.TextAlign = AligmentHelper.TranslateGridColumnAligment(currCell.DefaultCellStyle.Alignment);

                    sumTextBox.Invalidate();

                    continue;

                }

                if (!sumTextBox.IsHeaderLabel && !sumTextBox.IsSummary)

                {

                    sumTextBox.Text = "";

                    sumTextBox.Invalidate();

                }

            }

            this._SummaryRowHeaderLabel.Text = "√";

            //如果第一列是文本,则将统计文本设置到_SummaryRowHeaderLabel

            if (_FirstColSumTextType != SummaryTextType.Text)

            {

                this._SummaryRowHeaderLabel.Text = this._SummaryHeaderText;

            }

            this._SummaryRowHeaderLabel.TextAlign = HorizontalAlignment.Center;

            this._SummaryRowHeaderLabel.Font = new Font(this.DefaultCellStyle.Font, this._SummaryHeaderBold ? FontStyle.Bold : FontStyle.Regular);

            this._SummaryRowHeaderLabel.Invalidate();

        }

        #endregion

 

        #region 继承重写

        /// <summary>

        /// 键盘操作处理

        /// </summary>

        /// <param name="msg"></param>

        /// <param name="keyData"></param>

        /// <returns></returns>

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)

        {

            int WM_KEYDOWN = 256;

            int WM_SYSKEYDOWN = 260;

            if (msg.Msg == WM_KEYDOWN || msg.Msg == WM_SYSKEYDOWN)

            {

                switch (keyData)

                {

                    case Keys.Shift | Keys.Enter://按下Shift+Enter组合键时退格

                        SendKeys.Send("+{TAB}");

                        return true;

                    case Keys.Enter://按下Enter键时提供DataGridView快捷输入

                        if (this.CurrentCell.IsInEditMode)

                        {

                            SendKeys.Send("{TAB}");

                        }

                        else

                        {

                            if (this.CurrentCell is DataGridViewComboBoxCell)

                            {//下拉控件操作

                                SendKeys.Send("{F2}");

                                SendKeys.Send("{F4}");

                            }

                            else if (this.CurrentCell is DataGridViewCheckBoxCell)

                            {//复择框操作

                                SendKeys.Send(" ");

                                SendKeys.Send("{TAB}");

                            }

 

                            else if (this.CurrentCell is DataGridViewTextBoxCell)

                            {//文本框编辑

                                SendKeys.Send("{F2}");

                            }

                        }

                        return true;

                }

            }

            return base.ProcessCmdKey(ref msg, keyData);

        }

 

        protected override void OnPaint(PaintEventArgs e)

        {

            this.ResetSummaryContainer();

            base.OnPaint(e);

        }

        #endregion

    }

}

 

标签类SummaryTextBox.cs源码:

 

using System;

using System.ComponentModel;

using System.Collections.Generic;

using System.Diagnostics;

using System.Text;

using System.Drawing;

using System.Windows.Forms;

 

namespace Ruijc.UI.DataGridViewEx

{

    public partial class SummaryTextBox : Control

    {

        /// <summary>

        /// 文本格式化

        /// </summary>

        private StringFormat _Format;

        public SummaryTextBox()

        {            

            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 SummaryTextBox(IContainer container)

        {

            container.Add(this);

            InitializeComponent();

 

            this.TextChanged += new EventHandler(SummaryTextBox_TextChanged);

        }

 

        private void SummaryTextBox_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 _IsHeaderLabel=false;

        public bool IsHeaderLabel

        {

            get { return _IsHeaderLabel; }

            set { _IsHeaderLabel = 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 Color _ForeColor = Color.Blue;

        [DefaultValue(HorizontalAlignment.Left)]

        public new Color ForeColor

        {

            get { return _ForeColor; }

            set

            {

                _ForeColor = value;

            }

        }

 

        private StringTrimming _Trimming = StringTrimming.None;

        [DefaultValue(StringTrimming.None)]

        public StringTrimming Trimming

        {

            get { return _Trimming; }

            set

            {

                _Trimming = value;

                SetFormatFlags();

            }

        }

 

        private void SetFormatFlags()

        {

            _Format.Alignment = AligmentHelper.TranslateAligment(TextAlign);

            _Format.Trimming = _Trimming;                

        }

 

        public Color BorderColor

        {

            get { return _BorderColor; }

            set { _BorderColor = value; }

        }

 

        protected override void OnPaint(PaintEventArgs e)

        {

            Rectangle textBounds;

 

            if (!string.IsNullOrEmpty(_FormatString) && !string.IsNullOrEmpty(Text))

            {

                Text = String.Format("{0:" + _FormatString + "}", Convert.ToDecimal(Text));

            }

 

            textBounds = new Rectangle(this.ClientRectangle.X + 2, this.ClientRectangle.Y + 2, this.ClientRectangle.Width - 2 , this.ClientRectangle.Height - 2 );

            SolidBrush brush = new SolidBrush(this._ForeColor);

            using(Pen pen = new Pen(_BorderColor))

            {

                pen.Width = 2;

 

                e.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle);

                e.Graphics.DrawRectangle(pen, this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width , this.ClientRectangle.Height - 1);

                e.Graphics.DrawString(Text, Font, brush, textBounds, _Format);

            }

            brush.Dispose();

            e.Graphics.Dispose();

        }

    }

}

 

对齐转换源码:

 

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace Ruijc.UI.DataGridViewEx

{

    public static class AligmentHelper

    {

        public static StringAlignment TranslateAligment(HorizontalAlignment aligment)

        {

            if (aligment == HorizontalAlignment.Left)

                return StringAlignment.Near;

            else if (aligment == HorizontalAlignment.Right)

                return StringAlignment.Far;

            else

                return StringAlignment.Center;

        }

 

        public static HorizontalAlignment TranslateGridColumnAligment(DataGridViewContentAlignment aligment)

        {

            if (aligment == DataGridViewContentAlignment.BottomLeft || aligment == DataGridViewContentAlignment.MiddleLeft || aligment == DataGridViewContentAlignment.TopLeft)

                return HorizontalAlignment.Left;

            else if (aligment == DataGridViewContentAlignment.BottomRight || aligment == DataGridViewContentAlignment.MiddleRight || aligment == DataGridViewContentAlignment.TopRight  )

                return HorizontalAlignment.Right;

            else if (aligment == DataGridViewContentAlignment.MiddleCenter || aligment == DataGridViewContentAlignment.TopCenter || aligment == DataGridViewContentAlignment.BottomCenter)

                return HorizontalAlignment.Center;

            else

                return HorizontalAlignment.Left;

        }

 

        public static TextFormatFlags TranslateAligmentToFlag(HorizontalAlignment aligment)

        {

            if (aligment == HorizontalAlignment.Left)

                return TextFormatFlags.Left;

            else if (aligment == HorizontalAlignment.Right)

                return TextFormatFlags.Right;

            else

                return TextFormatFlags.HorizontalCenter;

        }

 

        public static TextFormatFlags TranslateTrimmingToFlag(StringTrimming trimming)

        {

            if (trimming == StringTrimming.EllipsisCharacter)

                return TextFormatFlags.EndEllipsis;

            else if (trimming == StringTrimming.EllipsisPath)

                return TextFormatFlags.PathEllipsis;

            if (trimming == StringTrimming.EllipsisWord)

                return TextFormatFlags.WordEllipsis;

            if (trimming == StringTrimming.Word)

                return TextFormatFlags.WordBreak;

            else

                return TextFormatFlags.Default;

        }

    }

}

 

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值