using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; namespace JJSoft.FrameWork.Controls { [ToolboxBitmap(typeof(JJSDataGridView), "Bitmap.JJSDataGridView.bmp")] public class JJSDataGridView : DataGridView { // 标题背景色 private Color clrCellBackColor; // 标题前景色 private Color clrHeaderForeColor; // 标题阴影 private Color clrHeaderForeDarkColor; // 单元格分界线色 private Color clrGridColor; // 单元格选中时前景色 private Color clrCellSelectForeColor; // 单元格值的颜色 private Color clrCellValueColor; // 单元格选中时值的颜色 private Color clrCellValueSelectedColor; public event JJSDataGridViewSpanColumnEventHandler SpanColumnAdd; /// <summary> /// 构造函数 /// </summary> public JJSDataGridView() { // 标题背景色 clrCellBackColor = Color.FromArgb(255, 255, 255); // 标题前景色 clrHeaderForeColor = Color.FromArgb(236, 233, 216); // 标题阴影 clrHeaderForeDarkColor = Color.FromArgb(113, 111, 100); // 单元格分界线色 clrGridColor = Color.FromArgb(192, 192, 192); // 单元格选中时前景色 clrCellSelectForeColor = Color.FromArgb(49, 106, 197); // 单元格值的颜色 clrCellValueColor = Color.FromArgb(0, 0, 0); // 单元格选中时值的颜色 clrCellValueSelectedColor = Color.FromArgb(255, 255, 255); } /// <summary> /// 重写OnCellPainting函数,重画单元格 /// </summary> /// <param name="e"></param> protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e) { // 调用基类的方法 base.OnCellPainting(e); using (Brush backColorBrush = new SolidBrush(clrCellBackColor), gridBrush = new SolidBrush(clrGridColor), headerBrush = new SolidBrush(clrHeaderForeColor), headerDarkBrush = new SolidBrush(clrHeaderForeDarkColor), selectCellForeBrush = new SolidBrush(clrCellSelectForeColor)) { // 擦去单元格,以便重画单元格 e.Graphics.FillRectangle(backColorBrush, e.CellBounds); // 如果不是标题单元格 if (e.RowIndex >= 0 && e.ColumnIndex >= 0) using (Pen gridLinePen = new Pen(gridBrush)) { // 画单元格线(右边与底边) // 底边 e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1); // 右边 e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1); // 如果是选中 if ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected) { e.Graphics.FillRectangle(selectCellForeBrush, e.CellBounds.X, e.CellBounds.Y, e.CellBounds.Width - 1, e.CellBounds.Height - 1); } } // 如果是标题 if (e.RowIndex < 0 || e.ColumnIndex < 0) { // 画标题前景色 Rectangle headerRect = new Rectangle(e.CellBounds.X + 1, e.CellBounds.Y + 1, e.CellBounds.Width - 2, e.CellBounds.Height - 2); e.Graphics.FillRectangle(headerBrush, headerRect); // 画前景色阴影 using (Pen headerDarkPen = new Pen(headerDarkBrush)) { // 底边 e.Graphics.DrawLine(headerDarkPen, e.CellBounds.Left + 1, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1); // 右边 e.Graphics.DrawLine(headerDarkPen, e.CellBounds.Right - 1, e.CellBounds.Top + 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1); } } // 把单元格的内容画出 if (e.Value != null) { StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; sf.LineAlignment = StringAlignment.Near; //e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, Brushes.Crimson, // e.CellBounds.X + 2, e.CellBounds.Y + 2, StringFormat.GenericDefault); using (Brush valueUnSelectedBrush = new SolidBrush(clrCellValueColor), valueSelectedBrush = new SolidBrush(clrCellValueSelectedColor)) { Brush valueBrush = null; if ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected) { valueBrush = valueSelectedBrush; } else { valueBrush = valueUnSelectedBrush; } e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, valueBrush, e.CellBounds.X + 2, e.CellBounds.Y + (e.CellBounds.Height - e.CellStyle.Font.Height) / 2, sf); } } e.Handled = true; } } /// <summary> /// 增加含有跨行列的列的处理 /// </summary> protected virtual void OnSpanColumnAdd(JJSDataGridViewSpanColumnEventArgs e) { } } /// <summary> /// 描述合并单元格的类 /// </summary> public class SpanDataGridViewCell { // 行数 private int rowCount; /// <summary> /// 设置或者获取行数 /// </summary> public int RowCount { get { return rowCount; } set { rowCount = value; } } // 开始列索引 private int startColIndex; /// <summary> /// 设置或者获取开始列索引 /// </summary> public int StartColIndex { get { return startColIndex; } set { startColIndex = value; } } // 结束列索引 private int endColIndex; /// <summary> /// 设置或者获取结束列索引 /// </summary> public int EndColIndex { get { return endColIndex; } set { endColIndex = value; } } // 开始行索引 private int startRowIndex; /// <summary> /// 设置或者获取开始行索引 /// </summary> public int StartRowIndex { get { return startRowIndex; } set { startRowIndex = value; } } // 结束行索引 private int endRowIndex; /// <summary> /// 设置或者获取结束行索引 /// </summary> public int EndRowIndex { get { return endRowIndex; } set { endRowIndex = value; } } } }