.net Winform 中的DataGridView 的外观有点难看。下面是重绘DataGridView的方法,可以重绘时参考:
1.重绘DataGridView
- protected override void Paint(
- Graphics graphics,
- Rectangle clipBounds,
- Rectangle cellBounds,
- int rowIndex,
- DataGridViewElementStates cellState,
- object value,
- object formattedValue,
- string errorText,
- DataGridViewCellStyle cellStyle,
- DataGridViewAdvancedBorderStyle advancedBorderStyle,
- DataGridViewPaintParts paintParts)
- {
- // Call the base class method to paint the default cell appearance.
- base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState,
- value, formattedValue, errorText, cellStyle,
- advancedBorderStyle, paintParts);
- // Retrieve the client location of the mouse pointer.
- Point cursorPosition =
- this.DataGridView.PointToClient(Cursor.Position);
- // If the mouse pointer is over the current cell, draw a custom border.
- if (cellBounds.Contains(cursorPosition))
- {
- Rectangle newRect = new Rectangle(cellBounds.X + 1,
- cellBounds.Y + 1, cellBounds.Width - 4,
- cellBounds.Height - 4);
- graphics.DrawRectangle(Pens.Red, newRect);
- }
- }
2.重绘DataGridView 的头部
- protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
- {
- base.OnCellPainting(e);
- if (e.ColumnIndex == -1 && e.RowIndex == -1)
- {
- using (LinearGradientBrush brush = new LinearGradientBrush(e.CellBounds, Color.LightGray,
- Color.White, LinearGradientMode.ForwardDiagonal))
- {
- e.Graphics.FillRectangle(brush, e.CellBounds);
- Rectangle border = e.CellBounds;
- border.Offset(new Point(-1, -1));
- e.Graphics.DrawRectangle(Pens.Gray, border);
- }
- e.PaintContent(e.CellBounds);
- e.Handled = true;
- }
- else if (e.RowIndex == -1)
- {
- //标题行
- using (LinearGradientBrush brush = new LinearGradientBrush(e.CellBounds, Color.LightGray,
- Color.White, LinearGradientMode.Vertical))
- {
- e.Graphics.FillRectangle(brush, e.CellBounds);
- Rectangle border = e.CellBounds;
- border.Offset(new Point(-1, -1));
- e.Graphics.DrawRectangle(Pens.Gray, border);
- }
- e.PaintContent(e.CellBounds);
- e.Handled = true;
- }
- else if (e.ColumnIndex == -1)
- {
- //标题列
- using (LinearGradientBrush brush = new LinearGradientBrush(e.CellBounds, Color.LightGray,
- Color.White, LinearGradientMode.Horizontal))
- {
- e.Graphics.FillRectangle(brush, e.CellBounds);
- Rectangle border = e.CellBounds;
- border.Offset(new Point(-1, -1));
- e.Graphics.DrawRectangle(Pens.Gray, border);
- }
- e.PaintContent(e.CellBounds);
- e.Handled = true;
- }
- }
3.重绘实现合并单元格
- #region"合并单元格的测试"
- private int? nextrow = null;
- private int? nextcol = null;
- private void dataGridView1_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
- {
- if (this.dataGridView1.Columns["description"].Index == e.ColumnIndex && e.RowIndex >= 0)
- {
- if (this.nextcol != null & e.ColumnIndex == this.nextcol)
- {
- e.CellStyle.BackColor = Color.LightBlue;
- this.nextcol = null;
- }
- if (this.nextrow != null & e.RowIndex == nextrow)
- {
- e.CellStyle.BackColor = Color.LightPink;
- this.nextrow = null;
- }
- if (e.RowIndex != this.dataGridView1.RowCount - 1)
- {
- if (e.Value.ToString() == this.dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value.ToString())
- {
- e.CellStyle.BackColor = Color.LightPink;
- nextrow = e.RowIndex + 1;
- }
- }
- }
- if (this.dataGridView1.Columns["name"].Index == e.ColumnIndex && e.RowIndex >= 0)
- {
- if (e.Value.ToString() == this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Value.ToString())
- {
- e.CellStyle.BackColor = Color.LightBlue;
- nextcol = e.ColumnIndex + 1;
- }
- }
- }
- //==========================
- //绘制单元格
- private void dataGridView1_CellPainting(object sender, System.Windows.Forms.DataGridViewCellPaintingEventArgs e)
- {
- //纵向合并
- if (this.dataGridView1.Columns["description"].Index == e.ColumnIndex && e.RowIndex >= 0)
- {
- using (
- Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor),
- backColorBrush = new SolidBrush(e.CellStyle.BackColor))
- {
- using (Pen gridLinePen = new Pen(gridBrush))
- {
- // 擦除原单元格背景
- e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
- 绘制线条,这些线条是单元格相互间隔的区分线条,
- 因为我们只对列name做处理,所以datagridview自己会处理左侧和上边缘的线条
- if (e.RowIndex != this.dataGridView1.RowCount - 1)
- {
- if (e.Value.ToString() != this.dataGridView1.Rows[e.RowIndex + 1].Cells[e.ColumnIndex].Value.ToString())
- {
- e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1,
- e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);//下边缘的线
- //绘制值
- if (e.Value != null)
- {
- e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
- Brushes.Crimson, e.CellBounds.X + 2,
- e.CellBounds.Y + 2, StringFormat.GenericDefault);
- }
- }
- }
- else
- {
- e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1,
- e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);//下边缘的线
- //绘制值
- if (e.Value != null)
- {
- e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
- Brushes.Crimson, e.CellBounds.X + 2,
- e.CellBounds.Y + 2, StringFormat.GenericDefault);
- }
- }
- //右侧的线
- e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,
- e.CellBounds.Top, e.CellBounds.Right - 1,
- e.CellBounds.Bottom - 1);
- e.Handled = true;
- }
- }
- }
- //横向合并
- if (this.dataGridView1.Columns["name"].Index == e.ColumnIndex && e.RowIndex >= 0)
- {
- using (
- Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor),
- backColorBrush = new SolidBrush(e.CellStyle.BackColor))
- {
- using (Pen gridLinePen = new Pen(gridBrush))
- {
- // 擦除原单元格背景
- e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
- if (e.Value.ToString() != this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex + 1].Value.ToString())
- {
- //右侧的线
- e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top,
- e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);
- //绘制值
- if (e.Value != null)
- {
- e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,
- Brushes.Crimson, e.CellBounds.X + 2,
- e.CellBounds.Y + 2, StringFormat.GenericDefault);
- }
- }
- //下边缘的线
- e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1,
- e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);
- e.Handled = true;
- }
- }
- }
- }
- #endregion