private Bitmap highPriImage; private Bitmap mediumPriImage; private Bitmap lowPriImage; private void dataGridView1_CellFormatting( object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) { // Set the background to red for negative values in the Balance column. if (dataGridView1.Columns[e.ColumnIndex].Name.Equals( " Balance " )) { Int32 intValue; if (Int32.TryParse((String)e.Value, out intValue) && (intValue < 0 )) { e.CellStyle.BackColor = Color.Red; e.CellStyle.SelectionBackColor = Color.DarkRed; } } // Replace string values in the Priority column with images. if (dataGridView1.Columns[e.ColumnIndex].Name.Equals( " Priority " )) { // Ensure that the value is a string. String stringValue = e.Value as string ; if (stringValue == null ) return ; // Set the cell ToolTip to the text value. DataGridViewCell cell = dataGridView1[e.ColumnIndex, e.RowIndex]; cell.ToolTipText = stringValue; // Replace the string value with the image value. switch (stringValue) { case " high " : e.Value = highPriImage; break ; case " medium " : e.Value = mediumPriImage; break ; case " low " : e.Value = lowPriImage; break ; } } }
#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
DataGridView表头重绘
DataGridView的表头不是很好看,或者有时和整体界面不是很协调,于是找了去查了一些资料,发现可以重绘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 ; } }