본문 바로가기
IT/Programming

ExtraGrid 컬럼 Merge하기

by 여우요원 2016. 2. 3.

Group Merge

Merge에 대한 간단한 팁입니다.

DevExpress의 XtraGrid뿐만 아니라 거의 대부분의 그리드에서 Cell Merge 기능을 제공하고 있습니다.


XtraGrid에서 Merge를 설정하는 방법은 다음과 같습니다


1.먼저 Views의 Options중에 OptionsView 항목중에서 AllowCellMerge를 True로 설정합니다.



2.각 컬럼에서 1에서 설정한 속성을 따르지 않는 컬럼만 별도로 설정하고 나머지는 Default로 둡니다(Columns->Options->OptionsColumn 항목에 있습니다)



하지만 이 Merge 기능에는 불편한 점이 하나 있는데 아마 한 번쯤은 다들 겪어보셨으리라 생각합니다.

각 컬럼별로 독립적으로 Megre를 하다보니 트리구조의 Merge가 되지 않는다는 것입니다.

상위 항목에 따라서 하위 컬럼들이 Merge가 되면 좋겠는데 이게 잘 안된다는 것이죠(저는 Group Merge라고 이름을 붙였습니다).


아래 그림을 보면 이해가 더 쉬우리라 생각합니다.



이 그림은 흔히 볼 수 있는 Merge화면입니다.

Order 번호 별로 각 차수가 있고 Order 별 상태와 Order별 Branch가 있습니다.

원래 의도는 Order별로 Merge를 하려는 것이었는데, 컬럼별 Merge속성을 주다보니 Order번호와는 관계없이 같은 값을 가지면 전부 Merge가 되어 버립니다.


우리가 원하는 형태의 그림은 아래와 같습니다.



이 그림은 오더번호를 기준으로 하위 컬럼들이 Merge된 형태입니다.

제가 찾아본 바로는 XtraGrid에서 바로 지원하는 속성은 없는 듯 싶습니다(물론 제가 찾지 못했을 수도 있습니다).

그래서 결국 코딩으로 구현했습니다.


그 코딩은 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub GV1_CellMerge(sender As System.Object, e As DevExpress.XtraGrid.Views.Grid.CellMergeEventArgs) Handles GV1.CellMerge
 
        Select Case e.Column.FieldName
 
            Case "Sts. Column Name""Branch Column Name "
 
                Dim view As DevExpress.XtraGrid.Views.Grid.GridView = CType(sender, DevExpress.XtraGrid.Views.Grid.GridView)
 
                Dim val1 As String = view.GetRowCellValue(e.RowHandle1, "Order No Column Name")
 
                Dim val2 As String = view.GetRowCellValue(e.RowHandle2, " Order No Column Name ")
 
                e.Merge = (val1 = val2)
 
                e.Handled = True
 
            Case Else
 
        End Select
 
    End Sub
 
cs


내용은 간단합니다.


GV1.CellMerge는 그리드에서 Merge가 발생할 때 일어나는 이벤트입니다.

Merge가 발생하는 컬럼이 내가 원하는 컬럼이고 기준이 되는 컬럼(여기서는 Order No)의 값이 같으면 Merge를 실행하도록 하는 코딩입니다. 


이렇게 함으로써 원하는 컬럼에 대해서 원하는 방식으로 Merge를 할 수 있습니다.



출처 : http://wishsky.tistory.com/entry/XtraGrid-Group-Merge