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