zoukankan      html  css  js  c++  java
  • WinForm控件设计:DataGridView的行统计实现

          做WinForm开发离不开一些基本的控件,作为数据列表显示控件中,其中最为重要的要数 DataGridView,以前用的是一些第三方控件,提供了比较灵活和方便的功能,比如:根据某列分组统计等等,确实方便,但加载第三方控件的缺点就是加载数据太慢,打包布署后体积大,更为甚者还要收费,咱又不能用盗版,没办法自力更生才是生存之道。

         DataGridView的行统计汇总功能在网络上搜索后,有一些同仁实现过(Summary DataGridView),但只是在某种特定的需求下实现了目标,要么是扩展不方便,要么是性能太差,加载一个DataGridView不知重复运行几十次代码(未做详细统计) ,为了一劳永逸的解决这个问题,特改写了代码,在此提供给各位同仁,欢迎斧正。

    1、首先,看使用方法:

     dgvProjectList.ShowSummary(new string[] { "TotalIncome""TotalFee""TotalCost""SaleAmount""RetainedProfits" });

            如果不使用统计汇总,不会对现有 DateGridView控件产生任何负作用,也不占用内存;"TotalIncome""TotalFee""TotalCost""SaleAmount""RetainedProfits" 为要统计的各行。

    效果如下:

     

     代码如下:

    1、DataGridView扩展方法定义

    代码
     #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

     2、核心类定义

    代码
    internal 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 = dgv.RowTemplate.Height;
                
    this.Top = dgv.Height - this.Height;
                
    this.Left = dgv.Left;
                
    this.BackColor = dgv.RowHeadersDefaultCellStyle.BackColor;

                sumBoxHash 
    = new Hashtable();
                sumRowHeaderLabel 
    = new Label();
                sumRowHeaderLabel.Height 
    = this.Height;
                sumRowHeaderLabel.Width 
    = dgv.RowHeadersWidth;
                sumRowHeaderLabel.BackColor 
    = dgv.RowHeadersDefaultCellStyle.BackColor;

                
    this.dgv.Resize += new EventHandler(dgv_Resize);
                
    this.dgv.Scroll += new ScrollEventHandler(dgv_Scroll);
                
    this.dgv.ColumnWidthChanged += new DataGridViewColumnEventHandler(dgv_ColumnWidthChanged);
                
    this.dgv.RowHeadersWidthChanged += new EventHandler(dgv_RowHeadersWidthChanged);

                
    this.dgv.RowsAdded += new DataGridViewRowsAddedEventHandler(dgv_RowsAdded);
                
    this.dgv.RowsRemoved += new DataGridViewRowsRemovedEventHandler(dgv_RowsRemoved);
                
    this.dgv.CellValueChanged += new DataGridViewCellEventHandler(dgv_CellValueChanged);
                
    this.dgv.DataSourceChanged += new EventHandler(dgv_DataSourceChanged);

                
    this.dgv.ColumnAdded += new DataGridViewColumnEventHandler(dgv_ColumnAdded);
                
    this.dgv.ColumnRemoved += new DataGridViewColumnEventHandler(dgv_ColumnRemoved);
                
    this.dgv.ColumnStateChanged += new DataGridViewColumnStateChangedEventHandler(dgv_ColumnStateChanged);
                
    this.dgv.ColumnDisplayIndexChanged += new DataGridViewColumnEventHandler(dgv_ColumnDisplayIndexChanged);

                reCreateSumBoxes();

            }
            
    #endregion

            
    #region 私有方法

            
    /// <summary>
            
    /// Checks if passed object is of type of integer
            
    /// </summary>
            
    /// <param name="o">object</param>
            
    /// <returns>true/ false</returns>
            protected bool IsInteger(object o)
            {
                
    if (o is Int64)
                {
                    
    return true;
                }
                
    if (o is Int32)
                {
                    
    return true;
                }
                
    if (o is Int16)
                {
                    
    return true;
                }
                
    return false;
            }

            
    /// <summary>
            
    /// Checks if passed object is of type of decimal/ double
            
    /// </summary>
            
    /// <param name="o">object</param>
            
    /// <returns>true/ false</returns>
            protected bool IsDecimal(object o)
            {
                
    if (o is Decimal)
                {
                    
    return true;
                }
                
    if (o is Single)
                {
                    
    return true;
                }
                
    if (o is Double)
                {
                    
    return true;
                }
                
    return false;
            }

            
    /// <summary>
            
    /// Calculate the Sums of the summary columns
            
    /// </summary>
            private void calcSummaries()
            {
                
    foreach (ReadOnlyTextBox roTextBox in sumBoxHash.Values)
                {
                    
    if (roTextBox.IsSummary)
                    {
                        roTextBox.Tag 
    = 0;
                        roTextBox.Text 
    = "0";
                        roTextBox.Invalidate();
                    }
                }
                
    if (SummaryColumns != null && SummaryColumns.Length > 0 && sumBoxHash.Count > 0)
                {
                    
    foreach (DataGridViewRow dgvRow in dgv.Rows)
                    {
                        
    foreach (DataGridViewCell dgvCell in dgvRow.Cells)
                        {
                            
    foreach (DataGridViewColumn dgvColumn in sumBoxHash.Keys)
                            {
                                
    if (dgvCell.OwningColumn.Equals(dgvColumn))
                                {
                                    ReadOnlyTextBox sumBox 
    = (ReadOnlyTextBox)sumBoxHash[dgvColumn];

                                    
    if (sumBox != null && sumBox.IsSummary)
                                    {
                                        
    if (dgvCell.Value != null && !(dgvCell.Value is DBNull))
                                        {
                                            
    if (IsInteger(dgvCell.Value))
                                            {
                                                sumBox.Tag 
    = Convert.ToInt64(sumBox.Tag) + Convert.ToInt64(dgvCell.Value);
                                            }
                                            
    else if (IsDecimal(dgvCell.Value))
                                            {
                                                sumBox.Tag 
    = Convert.ToDecimal(sumBox.Tag) + Convert.ToDecimal(dgvCell.Value);
                                            }

                                            sumBox.Text 
    = string.Format("{0}", sumBox.Tag);
                                            sumBox.Invalidate();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            
    /// <summary>
            
    /// Create summary boxes for each Column of the DataGridView        
            
    /// </summary>
            private void reCreateSumBoxes()
            {
                
    foreach (Control control in sumBoxHash.Values)
                {
                    
    this.Controls.Remove(control);
                }
                sumBoxHash.Clear();

                
    int iCnt = 0;

                ReadOnlyTextBox sumBox;
                List
    <DataGridViewColumn> sortedColumns = SortedColumns;
                
    foreach (DataGridViewColumn dgvColumn in sortedColumns)
                {
                    sumBox 
    = new ReadOnlyTextBox();
                    sumBoxHash.Add(dgvColumn, sumBox);

                    sumBox.Top 
    = 0;
                    sumBox.Height 
    = dgv.RowTemplate.Height;
                    sumBox.BorderColor 
    = dgv.GridColor;
                    sumBox.BackColor 
    = dgv.DefaultCellStyle.BackColor;
                    sumBox.ForeColor 
    = dgv.DefaultCellStyle.ForeColor;
                    sumBox.BringToFront();

                    
    if (dgv.ColumnCount - iCnt == 1)
                    {
                        sumBox.IsLastColumn 
    = true;
                    }

                    
    if (SummaryColumns != null && SummaryColumns.Length > 0)
                    {
                        
    for (int iCntX = 0; iCntX < SummaryColumns.Length; iCntX++)
                        {
                            
    if (SummaryColumns[iCntX] == dgvColumn.DataPropertyName ||
                                SummaryColumns[iCntX] 
    == dgvColumn.Name)
                            {
                                sumBox.TextAlign 
    = TextHelper.TranslateGridColumnAligment(dgvColumn.DefaultCellStyle.Alignment);
                                sumBox.IsSummary 
    = true;
                                sumBox.FormatString 
    = dgvColumn.DefaultCellStyle.Format;

                                
    if (dgvColumn.ValueType == typeof(System.Int32) || dgvColumn.ValueType == typeof(System.Int16) ||
                                    dgvColumn.ValueType 
    == typeof(System.Int64) || dgvColumn.ValueType == typeof(System.Single) ||
                                    dgvColumn.ValueType 
    == typeof(System.Double) || dgvColumn.ValueType == typeof(System.Single) ||
                                    dgvColumn.ValueType 
    == typeof(System.Decimal))
                                {
                                    sumBox.Tag 
    = System.Activator.CreateInstance(dgvColumn.ValueType);
                                }
                            }
                        }
                    }

                    sumBox.BringToFront();
                    
    this.Controls.Add(sumBox);

                    iCnt
    ++;
                }

                sumRowHeaderLabel.Font 
    = new Font(dgv.DefaultCellStyle.Font, SumRowHeaderTextBold ? FontStyle.Bold : FontStyle.Regular);
                sumRowHeaderLabel.Anchor 
    = AnchorStyles.Left;
                sumRowHeaderLabel.TextAlign 
    = ContentAlignment.MiddleRight;
                sumRowHeaderLabel.Height 
    = this.Height;
                sumRowHeaderLabel.Width 
    = dgv.RowHeadersWidth;
                sumRowHeaderLabel.Top 
    = 0;
                sumRowHeaderLabel.Text 
    = DisplaySumRowHeader ? SumRowHeaderText : string.Empty;
                sumRowHeaderLabel.ForeColor 
    = dgv.DefaultCellStyle.ForeColor;
                sumRowHeaderLabel.Margin 
    = new Padding(0);
                sumRowHeaderLabel.Padding 
    = new Padding(0);
                
    this.Controls.Add(sumRowHeaderLabel);
                calcSummaries();
                resizeSumBoxes();
            }

            
    /// <summary>
            
    /// Order the columns in the way they are displayed
            
    /// </summary>
            private List<DataGridViewColumn> SortedColumns
            {
                
    get
                {
                    List
    <DataGridViewColumn> result = new List<DataGridViewColumn>();
                    DataGridViewColumn column 
    = dgv.Columns.GetFirstColumn(DataGridViewElementStates.None);
                    
    if (column == null)
                    {
                        
    return result;
                    }
                    result.Add(column);
                    
    while ((column = dgv.Columns.GetNextColumn(column, DataGridViewElementStates.None, DataGridViewElementStates.None)) != null)
                    {
                        result.Add(column);
                    }

                    
    return result;
                }
            }

            
    /// <summary>
            
    /// Resize the summary Boxes depending on the 
            
    /// width of the Columns of the DataGridView
            
    /// </summary>
            private void resizeSumBoxes()
            {
                
    try
                {
                    
    this.SuspendLayout();
                    
    if (sumBoxHash != null && sumBoxHash.Count > 0)
                        
    try
                        {
                            
    int rowHeaderWidth = dgv.RowHeadersVisible ? dgv.RowHeadersWidth - 1 : 0;
                            
    int sumLabelWidth = dgv.RowHeadersVisible ? dgv.RowHeadersWidth - 1 : 0;
                            
    int curPos = rowHeaderWidth;

                            
    if (DisplaySumRowHeader && sumLabelWidth > 0)
                            {
                                sumRowHeaderLabel.Visible 
    = true;
                                sumRowHeaderLabel.Width 
    = sumLabelWidth;
                                
    if (dgv.RightToLeft == RightToLeft.Yes)
                                {
                                    
    if (sumRowHeaderLabel.Dock != DockStyle.Right)
                                    {
                                        sumRowHeaderLabel.Dock 
    = DockStyle.Right;
                                    }
                                }
                                
    else
                                {
                                    
    if (sumRowHeaderLabel.Dock != DockStyle.Left)
                                    {
                                        sumRowHeaderLabel.Dock 
    = DockStyle.Left;
                                    }
                                }
                            }
                            
    else
                            {
                                
    if (sumRowHeaderLabel.Visible)
                                {
                                    sumRowHeaderLabel.Visible 
    = false;
                                }
                            }

                            
    int iCnt = 0;
                            Rectangle oldBounds;

                            
    foreach (DataGridViewColumn dgvColumn in SortedColumns)
                            {
                                ReadOnlyTextBox sumBox 
    = (ReadOnlyTextBox)sumBoxHash[dgvColumn];
                                
    if (sumBox != null)
                                {
                                    oldBounds 
    = sumBox.Bounds;
                                    
    if (!dgvColumn.Visible)
                                    {
                                        sumBox.Visible 
    = false;
                                        
    continue;
                                    }


                                    
    int from = dgvColumn.Frozen ? curPos : curPos - dgv.HorizontalScrollingOffset;

                                    
    int width = dgvColumn.Width + (iCnt == 0 ? 0 : 0);

                                    
    if (from < rowHeaderWidth)
                                    {
                                        width 
    -= rowHeaderWidth - from;
                                        from 
    = rowHeaderWidth;
                                    }

                                    
    if (from + width > this.Width)
                                    {
                                        width 
    = this.Width - from;
                                    }

                                    
    if (width < 4)
                                    {
                                        
    if (sumBox.Visible)
                                        {
                                            sumBox.Visible 
    = false;
                                        }
                                    }
                                    
    else
                                    {
                                        
    if (this.RightToLeft == RightToLeft.Yes)
                                        {
                                            from 
    = this.Width - from - width;
                                        }


                                        
    if (sumBox.Left != from || sumBox.Width != width)
                                        {
                                            sumBox.SetBounds(from, 
    0, width, 0, BoundsSpecified.X | BoundsSpecified.Width);
                                        }

                                        
    if (!sumBox.Visible)
                                        {
                                            sumBox.Visible 
    = true;
                                        }
                                    }

                                    curPos 
    += dgvColumn.Width + (iCnt == 0 ? 0 : 0);
                                    
    if (oldBounds != sumBox.Bounds)
                                    {
                                        sumBox.Invalidate();
                                    }
                                }
                                iCnt
    ++;
                            }
                        }
                        
    finally
                        {
                            
    this.ResumeLayout();
                        }
                }
    #if (DEBUG)
                
    catch (Exception ee)
                {
                    MessageBox.Show(ee.ToString());
                    System.Diagnostics.Debug.WriteLine(ee.ToString());
                }

    #else
                
    catch
                { }
    #endif
            }

            
    #endregion

            
    #region 事件处理程序
            
    void dgv_DataSourceChanged(object sender, EventArgs e)
            {
                calcSummaries();
            }
            
    private void dgv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                ReadOnlyTextBox roTextBox 
    = (ReadOnlyTextBox)sumBoxHash[dgv.Columns[e.ColumnIndex]];
                
    if (roTextBox != null)
                {
                    
    if (roTextBox.IsSummary)
                    {
                        calcSummaries();
                    }
                }
            }
            
    private void dgv_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
            {
                calcSummaries();
            }
            
    private void dgv_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
            {
                calcSummaries();
            }

            
    private void dgv_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e)
            {
                
    //resizeSumBoxes();
                reCreateSumBoxes();
            }
            
    private void dgv_ColumnStateChanged(object sender, DataGridViewColumnStateChangedEventArgs e)
            {
                resizeSumBoxes();
            }
            
    private void dgv_Scroll(object sender, ScrollEventArgs e)
            {
                resizeSumBoxes();
            }
            
    private void dgv_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
            {
                resizeSumBoxes();
            }
            
    private void dgv_RowHeadersWidthChanged(object sender, EventArgs e)
            {
                
    int columnsWidth = 0;
                
    for (int iCnt = 0; iCnt < dgv.Columns.Count; iCnt++)
                {
                    
    if (dgv.Columns[iCnt].Visible)
                    {
                        
    if (dgv.Columns[iCnt].AutoSizeMode == DataGridViewAutoSizeColumnMode.Fill)
                        {
                            columnsWidth 
    += dgv.Columns[iCnt].MinimumWidth;
                        }
                        
    else
                            columnsWidth 
    += dgv.Columns[iCnt].Width;
                    }
                }
                
    this.Width = columnsWidth;
                resizeSumBoxes();
            }

            
    protected override void OnResize(EventArgs e)
            {
                
    base.OnResize(e);
                resizeSumBoxes();
            }
            
    private void dgv_Resize(object sender, EventArgs e)
            {
                adjustSumControlToGrid();

                resizeSumBoxes();
            }
            
    private void adjustSumControlToGrid()
            {
                ScrollBar horizontalScrollBar 
    = (ScrollBar)typeof(DataGridView).GetProperty("HorizontalScrollBar", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).GetValue(dgv, null);
                ScrollBar verticalScrollBar 
    = (ScrollBar)typeof(DataGridView).GetProperty("VerticalScrollBar", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).GetValue(dgv, null);


                
    if (horizontalScrollBar.Visible)
                {
                    
    this.Top = dgv.Height - this.Height - horizontalScrollBar.Height;
                }
                
    else
                {
                    
    this.Top = dgv.Height - this.Height;
                }
                
    this.Left = dgv.Left;
                
    if (verticalScrollBar.Visible)
                {
                    
    this.Width = dgv.Width - verticalScrollBar.Width;
                }
                
    else
                {
                    
    this.Width = dgv.Width;
                }
            }


            
    private void dgv_ColumnRemoved(object sender, DataGridViewColumnEventArgs e)
            {
                reCreateSumBoxes();
            }
            
    private void dgv_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
            {
                reCreateSumBoxes();
            }
            
    #endregion        
        }
    internal 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));
                }

                textBounds 
    = new Rectangle(this.ClientRectangle.X + 2this.ClientRectangle.Y + 2this.ClientRectangle.Width - 2 , this.ClientRectangle.Height - 2 );
                
    using(Pen pen = new Pen(borderColor))
                {
                    
    if (isLastColumn)
                        subWidth 
    = 1;

                    e.Graphics.FillRectangle(
    new SolidBrush(this.BackColor), this.ClientRectangle);
                    e.Graphics.DrawRectangle(pen, 
    this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width - subWidth , this.ClientRectangle.Height - 1);             
                    e.Graphics.DrawString(Text, Font, Brushes.Black, textBounds , format );
                }
            }
        }
    internal static class TextHelper
        {
            
    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
                    
    return HorizontalAlignment.Center;
            }

            
    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;
            }
        }


  • 相关阅读:
    Tomcat安装和配置过程
    Java集合框架概述
    Hash表的原理
    Java 浅拷贝和深拷贝的理解和实现方式
    Nginx 配置上传文件大小
    将博客搬至CSDN
    vscode中设置vue代码片段
    底部标签栏获取token失败
    Eacharts K线报错问题
    阿里字体图标库在项目中引用
  • 原文地址:https://www.cnblogs.com/yyj/p/1857518.html
Copyright © 2011-2022 走看看