1. 호출하는 코드
private void dgvView_Paint(object sender, PaintEventArgs e)
{
//DgvColumnHeaderCellMerge(dgvView, e, StringAlignment.Center, "Header Merge", 2, 2);
var infos = new List<HeaderCellMerge.DgvHeaderCellMergeInfo>
{
new HeaderCellMerge.DgvHeaderCellMergeInfo { Align = StringAlignment.Center, Header = "Header Merge1", StartColIdx = 2, MergeCnt = 2 },
new HeaderCellMerge.DgvHeaderCellMergeInfo { Align = StringAlignment.Center, Header = "Header Merge2", StartColIdx = 4, MergeCnt = 3 }
};
HeaderCellMerge.DgvColumnHeaderCellMerge(dgvView, e, infos);
}
2. 소스
namespace DgvCellMergeHelper
{
public class HeaderCellMerge
{
/// <summary>
/// DataGridView Column Header Cell 병합
/// <para>- 생성자에서 칼럼헤더의 높이를 적당히(2배) 설정함.</para>
/// <para>- DataGridView의 Paint 이벤트에서 호출하면 됨.</para>
/// </summary>
/// <param name="dgv"></param>
/// <param name="e"></param>
/// <param name="align"></param>
/// <param name="header"></param>
/// <param name="startColIdx"></param>
/// <param name="mergeCnt"></param>
public static void DgvColumnHeaderCellMerge(DataGridView dgv, PaintEventArgs e, StringAlignment align, string header, int startColIdx, int mergeCnt)
{
try
{
if (dgv.Columns.Count < startColIdx + mergeCnt)
return;
DataGridViewContentAlignment ca = align == StringAlignment.Near
? DataGridViewContentAlignment.BottomLeft
: align == StringAlignment.Center
? DataGridViewContentAlignment.BottomCenter
: DataGridViewContentAlignment.BottomRight;
Rectangle r1 = dgv.GetCellDisplayRectangle(startColIdx, -1, true);
var cell = dgv.Columns[startColIdx].HeaderCell;
cell.Style.Alignment = ca;
int w2 = 0;
for (int i = 1; i < mergeCnt; ++i)
{
cell = dgv.Columns[startColIdx + i].HeaderCell;
if (cell != null)
cell.Style.Alignment = ca;
w2 += dgv.GetCellDisplayRectangle(startColIdx + i, -1, true).Width;
}
r1.X += 1;
r1.Y += 1;
r1.Width = r1.Width + w2 - 2;
r1.Height = r1.Height / 2 - 2;
// Fill and draw the merged text
using (SolidBrush brush = new SolidBrush(dgv.ColumnHeadersDefaultCellStyle.BackColor))
{
e.Graphics.FillRectangle(brush, r1);
}
StringFormat format = new StringFormat { Alignment = align, LineAlignment = align };
e.Graphics.DrawString(header, dgv.ColumnHeadersDefaultCellStyle.Font, new SolidBrush(dgv.ColumnHeadersDefaultCellStyle.ForeColor), r1, format);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
/// <summary>
/// DataGridView Column Header Cell 다중병합
/// <para>- 생성자에서 칼럼헤더의 높이를 적당히(2배) 설정함.</para>
/// <para>- DataGridView의 Paint 이벤트에서 호출하면 됨.</para>
/// </summary>
/// <param name="dgv"></param>
/// <param name="e"></param>
/// <param name="infos"></param>
public static void DgvColumnHeaderCellMerge(DataGridView dgv, PaintEventArgs e, List<DgvHeaderCellMergeInfo> infos)
{
try
{
foreach (var v in infos)
{
if (dgv.Columns.Count < v.StartColIdx + v.MergeCnt)
return;
DataGridViewContentAlignment ca = v.Align == StringAlignment.Near
? DataGridViewContentAlignment.BottomLeft
: v.Align == StringAlignment.Center
? DataGridViewContentAlignment.BottomCenter
: DataGridViewContentAlignment.BottomRight;
Rectangle r1 = dgv.GetCellDisplayRectangle(v.StartColIdx, -1, true);
var cell = dgv.Columns[v.StartColIdx].HeaderCell;
cell.Style.Alignment = ca;
int w2 = 0;
for (int i = 1; i < v.MergeCnt; ++i)
{
cell = dgv.Columns[v.StartColIdx + i].HeaderCell;
if (cell != null)
cell.Style.Alignment = ca;
w2 += dgv.GetCellDisplayRectangle(v.StartColIdx + i, -1, true).Width;
}
r1.X += 1;
r1.Y += 1;
r1.Width = r1.Width + w2 - 2;
r1.Height = r1.Height / 2 - 2;
// Fill and draw the merged text
using (SolidBrush brush = new SolidBrush(dgv.ColumnHeadersDefaultCellStyle.BackColor))
{
e.Graphics.FillRectangle(brush, r1);
}
StringFormat format = new StringFormat { Alignment = v.Align, LineAlignment = v.Align };
e.Graphics.DrawString(v.Header, dgv.ColumnHeadersDefaultCellStyle.Font, new SolidBrush(dgv.ColumnHeadersDefaultCellStyle.ForeColor), r1, format);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
/// <summary>
/// DataGridView Column Header Cell Merge Info
/// </summary>
public class DgvHeaderCellMergeInfo
{
public StringAlignment Align { get; set; }
public string Header { get; set; }
public int StartColIdx { get; set; }
public int MergeCnt { get; set; }
}
}
}
'유용한 정보' 카테고리의 다른 글
| [C#] 빈문자열 출력이 가능한 NumericUpDown 컨트롤 만들기 (4) | 2025.07.06 |
|---|---|
| [C#] DataGridView에서 콤보박스 컬럼을 사용하기 (2) | 2025.06.24 |
| [C#] ComboBox의 DataSource에 DataTable을 연결하여 사용하기 (0) | 2025.06.15 |
| [C#] DataGridView의 짝수행과 홀수행을 다르게 지정하는 방법 (0) | 2025.06.03 |
| [C#] DataGridView에서 DataSource 연동하는 방법 (0) | 2025.05.24 |