DataGridView单元格美化

时间:2021-03-29 16:18:14
        DataGridView单元格美化

#region 重绘Column、Row
        int _RowHeadWidth = 41;        /// <summary>           /// 重绘Column、Row           /// </summary>           /// <param name="e"></param>           ///         private void gdvPersonInfo_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)        {            //如果是Column               if (e.RowIndex == -1)            {                drawColumnAndRow(e);                e.Handled = true;                //如果是Rowheader               }            else if (e.ColumnIndex < 0 && e.RowIndex >= 0)            {                drawColumnAndRow(e);                _RowHeadWidth = e.CellBounds.Width;                e.Handled = true;            }        }
        /// <summary>           /// Column和RowHeader绘制           /// </summary>           /// <param name="e"></param>           void drawColumnAndRow(DataGridViewCellPaintingEventArgs e)        {            // 绘制背景色               using (LinearGradientBrush backbrush =                new LinearGradientBrush(e.CellBounds,                    ProfessionalColors.MenuItemPressedGradientBegin,                    ProfessionalColors.MenuItemPressedGradientMiddle                    , LinearGradientMode.Vertical))            {
                Rectangle border = e.CellBounds;                border.Width -= 1;                //填充绘制效果                   e.Graphics.FillRectangle(backbrush, border);                //绘制Column、Row的Text信息                   e.PaintContent(e.CellBounds);  // 参数的意义?                   //绘制边框                   ControlPaint.DrawBorder3D(e.Graphics, e.CellBounds, Border3DStyle.Etched);
            }        }
        #endregion

        #region 重绘选中状态
        #region Row重绘前处理
        /// <summary>           /// Row重绘前处理,绘制行样式           /// </summary>           /// <param name="e"></param>        ///         private void gdvPersonInfo_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)        {
            //是否是选中状态               if ((e.State & DataGridViewElementStates.Selected) ==                        DataGridViewElementStates.Selected)            {                // 计算选中区域Size                   int width = this.gdvPersonInfo.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) + _RowHeadWidth;
                Rectangle rowBounds = new Rectangle(                  0, e.RowBounds.Top, width,                    e.RowBounds.Height);
                // 绘制选中背景色                   using (LinearGradientBrush backbrush =                    new LinearGradientBrush(rowBounds,                        Color.SteelBlue,                        e.InheritedRowStyle.ForeColor, 90.0f))                {                    e.Graphics.FillRectangle(backbrush, rowBounds);                    e.PaintCellsContent(rowBounds);                    e.Handled = true;       //告诉系统,已经自己重绘过了,该次绘制任务到此结束                   }
            }        }
        #endregion
        #region Row重绘后处理
        /// <summary>           /// Row重绘后处理,目前显示效果不大           /// </summary>           /// <param name="e"></param>           private void gdvPersonInfo_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)        {            int width = this.gdvPersonInfo.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) + _RowHeadWidth;            Rectangle rowBounds = new Rectangle(                   0, e.RowBounds.Top, width, e.RowBounds.Height);
            if (this.gdvPersonInfo.CurrentCellAddress.Y == e.RowIndex)            {                //设置选中边框,显示为虚线的聚焦框                   e.DrawFocus(rowBounds, true);            }        }
        #endregion
        #region Row刷新        /// <summary>           /// 宽度改变后处理,暂时没出现效果           /// </summary>           private void gdvPersonInfo_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)        {            if (this.gdvPersonInfo.CurrentRow != null)                this.gdvPersonInfo.InvalidateRow(this.gdvPersonInfo.CurrentRow.Index);        }
        /// <summary>           /// 用户或代码滚动工作区时发生,暂没看见效果           /// </summary>           protected override void OnScroll(ScrollEventArgs e)        {            base.OnScroll(e);            if (this.gdvPersonInfo.CurrentRow != null)                this.gdvPersonInfo.InvalidateRow(this.gdvPersonInfo.CurrentRow.Index);        }
        #endregion
        #endregion