C1FlexGrid - Merge()
# 2) .Net ( Vs 2005 )/WinForm2025. 4. 22. 12:52
셀 병합
: 다른 병합 방법이 있지만... 새로 만들어본 병합 코드이다.
: 각 셀에 index를 가지고 인접한 셀에 값이 같은지 확인하고 같으면 같은 영역으로 몰아주기를 진행한다.
: 소스에서 보듯이 각 행마다 오른쪽(컬럼이동)으로 먼저 확인하고 같은 셀들을 몰아주기
: 다음 각 컬럼마다 아래쪽(행이동)으로 확인하면서 같은 셀들을 몰아준다.
* 진행 순서에 따라 열이 먼저 병합될지 행이 먼저 병합될지를 결정한다.
* 소량의 데이타를 가지고 해볼 수 있는 간단한 소스이다.
각 셀의 갯수만큼 CR을 생성하여 인접한 셀로 몰아주기 처리를 하기 때문에 데이타가 너무 많으면... 장담 못한다.
데이타 갯수는 따로 해보진 않아서... 모르겠고...
* 개발하면서 떠올린 생각 : 뿌요뿌요....
private void Merge()
{
C1FlexGrid grd = c1FlexGrid1;
List<CR> merges = new List<CR>();
for (int rIdx = grd.Rows.Fixed; rIdx < grd.Rows.Count; rIdx++)
{
for (int cIdx = grd.Cols.Fixed; cIdx < grd.Cols.Count; cIdx++)
{
int r = rIdx - grd.Rows.Fixed;
int c = cIdx - grd.Cols.Fixed;
merges.Add(new CR() {
idx = (r * (grd.Cols.Count- grd.Cols.Fixed)) + c
, r1 = rIdx, r2 = rIdx, c1 = cIdx, c2 = cIdx
, Text = $"{grd[rIdx, cIdx]}"
});
}
}
for (int rIdx = grd.Rows.Fixed; rIdx < grd.Rows.Count; rIdx++)
{
int r = rIdx - grd.Rows.Fixed;
int cHold = -1;
for (int cIdx = grd.Cols.Fixed; cIdx < grd.Cols.Count; cIdx++)
{
// 옆으로...
int c = cIdx - grd.Cols.Fixed;
if (cHold == -1) cHold = c;
int idx = (r * (grd.Cols.Count - grd.Cols.Fixed)) + cHold;
CR cr = merges[idx];
int nidx = (r * (grd.Cols.Count - grd.Cols.Fixed)) + c+1;
if (nidx < merges.Count)
{
CR ncr = merges[nidx];
if (cr.Text == ncr.Text && ncr.Merged == false)
{
cr.c2 = ncr.c2;
ncr.Merged = true;
}
if (cr.Text != ncr.Text) cHold = -1;
}
}
}
for (int cIdx = grd.Cols.Fixed; cIdx < grd.Cols.Count; cIdx++)
{
// 아래로
int c = cIdx - grd.Cols.Fixed;
int rHold = -1;
for (int rIdx = grd.Rows.Fixed; rIdx < grd.Rows.Count; rIdx++)
{
int r = rIdx - grd.Rows.Fixed;
if( rHold == -1) rHold = r;
int idx = (rHold * (grd.Cols.Count - grd.Cols.Fixed)) + c;
CR cr = merges[idx];
int nidx = ((r+1) * (grd.Cols.Count - grd.Cols.Fixed)) + c;
if (nidx < merges.Count)
{
CR ncr = merges[nidx];
if (cr.Text == ncr.Text && ncr.Merged == false)
{
cr.r2 = ncr.r2;
ncr.Merged = true;
}
if (cr.Text != ncr.Text)
{
rHold = -1;
}
}
}
}
List<CR> Mrgs = merges.Where(cell => cell.Merged == false).ToList();
grd.AllowMerging = AllowMergingEnum.Custom;
foreach (var mr in Mrgs)
{
grd.MergedRanges.Add(mr.r1, mr.c1, mr.r2, mr.c2);
}
}
'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글
달력/시각 컨트롤... (0) | 2025.03.16 |
---|---|
Popup? (0) | 2025.03.16 |
[일자 & 시간] 컨트롤... (0) | 2024.08.04 |
뭐 좀 만들어볼까하다가.... (0) | 2024.08.03 |
Flow Condition] 조건 오브젝트 뷰 만들기? (0) | 2018.04.29 |