using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
![](/Images/OutliningIndicators/None.gif)
namespace JControl.WinForm
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public class JDataGrid : DataGridView
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
//private ScrollableControl m_ScrollableControl = null;
private List<MergeTitle> m_MergeTitles = null;
private List<int> m_EndCols = null;
private Color m_BoundColor = Color.Black;
public void AddMergeTitle(MergeTitle mergeTitle)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (m_MergeTitles == null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
m_MergeTitles = new List<MergeTitle>();
m_EndCols = new List<int>();
}
m_MergeTitles.Add(mergeTitle);
m_EndCols.Add(mergeTitle.EndCol);
}
public void RemoveMergeTitle(int Index)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
m_MergeTitles.RemoveAt(Index);
m_EndCols.RemoveAt(Index);
}
[Category("MergeTitle"), Browsable(false), Description("设置合并单元标题")]
public List<MergeTitle> MergeTitles
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{return m_MergeTitles;}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ m_MergeTitles = value; }
}
![](/Images/OutliningIndicators/InBlock.gif)
public Color BoundColor
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{return m_BoundColor;}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{m_BoundColor = value;}
}
protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (e.ColumnIndex > 0 && e.RowIndex == -1 &&
this.Columns[e.ColumnIndex] is DataGridViewTextBoxColumn)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
if (m_EndCols.Contains(e.ColumnIndex))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
foreach (MergeTitle mergeTitle in m_MergeTitles)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (e.ColumnIndex == mergeTitle.EndCol)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.DrawSingleMergeTitle(mergeTitle, e);
}
}
![](/Images/OutliningIndicators/InBlock.gif)
}
}
base.OnCellPainting(e);
}
private void DrawSingleMergeTitle(MergeTitle mergeTitle,DataGridViewCellPaintingEventArgs e)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
using
(
Brush gridBrush = new SolidBrush(m_BoundColor),
backColorBrush = new SolidBrush(e.CellStyle.BackColor),
ForeColorBrush = new SolidBrush(e.CellStyle.ForeColor)
)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int sizeWidth = 0;
for (int i = mergeTitle.StartCol; i <= mergeTitle.EndCol; i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
sizeWidth += this.Columns[i].Width;
}
Size size = new Size(sizeWidth, this.ColumnHeadersHeight);
Point loct = new Point(e.CellBounds.X - sizeWidth+e.CellBounds.Width, e.CellBounds.Y);
RectangleF rectf = new RectangleF((PointF)loct, (SizeF)size);
![](/Images/OutliningIndicators/InBlock.gif)
e.Graphics.FillRectangle(backColorBrush, rectf);
//draw line & title
using (Pen gridLinePen = new Pen(gridBrush))
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// LEFT
e.Graphics.DrawLine(gridLinePen, rectf.X, rectf.Y, rectf.X, rectf.Bottom);
//RIGHT
e.Graphics.DrawLine(gridLinePen, rectf.Right - 1, rectf.Y, rectf.Right - 1, rectf.Bottom);
//TOP
e.Graphics.DrawLine(gridLinePen, rectf.X, rectf.Y, rectf.Right, rectf.Y);
//BOTTOM
e.Graphics.DrawLine(gridLinePen, rectf.X, rectf.Y + rectf.Bottom - 2, rectf.Right, rectf.Y + rectf.Bottom - 2);
![](/Images/OutliningIndicators/InBlock.gif)
if (m_MergeTitles.Count > 0)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
float y = 0, ly = 0;
for (int i = 1; i < m_MergeTitles.Count+1; i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
y = rectf.Y + rectf.Height * i / m_MergeTitles.Count;
//X Center separator
e.Graphics.DrawLine(gridLinePen, rectf.X, y, rectf.Right,y);
//Y Center separator
if (i < m_MergeTitles.Count)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
float xW = rectf.Width / m_MergeTitles[i - 1].Titles.Count;
float lx = rectf.X;
for (int j = 1; j <= m_MergeTitles[i - 1].Titles.Count; j++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
float x = rectf.X + xW * j;
SizeF fSize = e.Graphics.MeasureString(
m_MergeTitles[i - 1].Titles[j - 1], e.CellStyle.Font);
e.Graphics.DrawString(m_MergeTitles[i - 1].Titles[j - 1], e.CellStyle.Font,
ForeColorBrush, lx + (x - lx - fSize.Width) / 2, ly + (y - ly - fSize.Height) / 2,
StringFormat.GenericDefault);
![](/Images/OutliningIndicators/InBlock.gif)
lx += x - lx;
![](/Images/OutliningIndicators/InBlock.gif)
e.Graphics.DrawLine(gridLinePen, x, ly, x, y);
![](/Images/OutliningIndicators/InBlock.gif)
}
}
else //last title
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
float lx = rectf.X;
for (int k = mergeTitle.StartCol,t=0; k <= mergeTitle.EndCol; k++,t++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/InBlock.gif)
SizeF fSize = e.Graphics.MeasureString(
m_MergeTitles[i - 1].Titles[t], e.CellStyle.Font);
e.Graphics.DrawString(m_MergeTitles[i - 1].Titles[t], e.CellStyle.Font,
ForeColorBrush, lx + (this.Columns[k].Width - fSize.Width) / 2, ly + (y - ly - fSize.Height) / 2, StringFormat.GenericDefault);
lx += this.Columns[k].Width;
e.Graphics.DrawLine(gridLinePen, lx, ly, lx, y);
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
}
}
ly = y;
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
}
}
e.Handled = true;
}
}
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
---------------------------------------------------------------------------------
![](/Images/OutliningIndicators/None.gif)
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.ComponentModel;
![](/Images/OutliningIndicators/None.gif)
namespace JControl.WinForm
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public class MergeTitle
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private int m_StartCol = -1;
private int m_EndCol = -1;
private List<string> m_Titles = new List<string>();
[Browsable(true), Description("设置合并单元开始列")]
public int StartCol
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return m_StartCol; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ m_StartCol = value; }
}
[Browsable(true), Description("设置合并单元结束列")]
public int EndCol
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return m_EndCol; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ m_EndCol = value; }
}
[Browsable(true), Description("设置合并单元标题")]
[DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Content)]
public List<string> Titles
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return m_Titles;}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ m_Titles = value; }
}
public void AddTitle(string Title)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
m_Titles.Add(Title);
}
public void RemoveTitle(int Index)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
m_Titles.RemoveAt(Index);
}
![](/Images/OutliningIndicators/InBlock.gif)
}
}
![](/Images/OutliningIndicators/None.gif)