DataGridView 显示行号与背景颜色
实现的方式有好几种。之前使用的是下面这种在RowPostPaint
事件中实现,效率不高。每次改变控件尺寸时都会执行
private void MsgGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { DataGridView gdView = sender as DataGridView; System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, gdView.RowHeadersWidth - 4, e.RowBounds.Height); TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), gdView.RowHeadersDefaultCellStyle.Font, rectangle, gdView.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right); }
为了消除更新所带来的的闪屏问题,需要开启窗体和控件的双缓存,在窗体的构造函数中插入下面的代码。
private IGForm() { //设置窗体的双缓冲 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true); this.UpdateStyles(); InitializeComponent(); // //利用反射设置DataGridView的双缓冲 Type dgvType = this.MsgGridView.GetType(); PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic); pi.SetValue(this.MsgGridView, true, null); }
===========================================
显示DataGridView背景颜色
//单元格样式的BackColor方法设置背景色 DataGridView.RowsDefaultCellStyle.BackColor = Color.LightSteelBlue; //奇数行样式的BackColor方法设置 DataGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.LightSteelBlue;
整合一下,封装到一个类中,方便调用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; namespace SimpleDataGridView { /// <summary> /// 设置DataGridView的样式 /// </summary> public class DataGridViewStyle { /// <summary> /// 普通的样式 /// </summary> public void DgvStyle1(DataGridView dgv) { //奇数行的背景色 dgv.AlternatingRowsDefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); dgv.AlternatingRowsDefaultCellStyle.SelectionForeColor = System.Drawing.Color.Blue; dgv.AlternatingRowsDefaultCellStyle.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); dgv.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); //默认的行样式 dgv.RowsDefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(192))))); dgv.RowsDefaultCellStyle.SelectionBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(255))))); dgv.RowsDefaultCellStyle.SelectionForeColor = System.Drawing.Color.Blue; //数据网格颜色 dgv.GridColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(192))))); //列标题的宽度 dgv.ColumnHeadersHeight = 28; } /// <summary> /// 凹凸样式 /// </summary> /// 需要手动设置this.RowTemplate.DividerHeight = 2; public void DgvStyle2(DataGridView dgv) { dgv.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.Sunken; //列标题的边框样式 dgv.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Sunken; dgv.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); dgv.ColumnHeadersDefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))); dgv.ColumnHeadersHeight = 28; //行的边框样式 dgv.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Sunken; dgv.DefaultCellStyle.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); dgv.RowTemplate.DividerHeight = 1; //禁止当前默认的视觉样式 dgv.EnableHeadersVisualStyles = false; } /// <summary> /// 给DataGridView添加行号 /// </summary> /// <param name="dgv"></param> /// <param name="e"></param> public static void DgvRowPostPaint(DataGridView dgv, DataGridViewRowPostPaintEventArgs e) { try { //添加行号 SolidBrush v_SolidBrush = new SolidBrush(dgv.RowHeadersDefaultCellStyle.ForeColor); int v_LineNo = 0; v_LineNo = e.RowIndex + 1; string v_Line = v_LineNo.ToString(); e.Graphics.DrawString(v_Line, e.InheritedRowStyle.Font, v_SolidBrush, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + 5); } catch (Exception ex) { MessageBox.Show("添加行号时发生错误,错误信息:" + ex.Message, "操作失败"); } } } }
作者:DotNet码农
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.