[C#, DevExpress] GridConrol DataSource vs GridView DataSource
회사에 입사하자마자 C# DevExpress로 UI를 제작해야 했다.
사수 포지션을 맡으신 분이 틀을 잡아놨고, 이 틀을 이용해서 기능들을 추가해 나가면 되는 부분이었다.
처음에는 GridConrol과 GridView의 차이점을 몰라서 해맸다.
대표적인 차이점은 Grid Control은 표의 동작과 관련된 이벤트를 관리하고 Grid View는 표의 표시와 관련된 이벤트를 관리한다.
이름 그대로지 않냐고 한다면 이름그대로가 맞다.
하지만 입사 초기에는 당연한거지만 당연하다고 생각하지 못했다.
혹시나 몰랐던 사람이 있다면 나도 이러니 부끄러워할 필요는 없다.
GridView DataSource에 DataTable 데이터를 넣었는데, 사수되시는 분이 이러면 안된다고 하셨다.
그 이유는 DataView는 사용자가 filter로 검색하거나 열을 클릭해서 순서를 재배치하면, DataSource에 들어간 실제 데이터가 변경되어버린다는 이유였다.
예를 들자면 A B C라는 Column에 3개의 Row를 역순으로 해서 넣었다. 그러면 형태는
A | B | C | |
Row[3] | a3 | b3 | c3 |
Row[2] | a2 | b2 | c2 |
Row[1] | a1 | b1 | c1 |
이렇게 된다. 이때의 gridView의 1행은 GridView.Rows[0] = Row[3] 이된다.
그때 표의 A Column을 클릭해서 A 열의 순서를 정렬한다면,
A | B | C | |
Row[1] | a1 | b1 | c1 |
Row[2] | a2 | b2 | c2 |
Row[3] | a3 | b3 | c3 |
이렇게 바뀌고, 이때 GridView DataSource 값을 그대로 받으면 GridView.Rows[0] = Row[1]이 되버린다.
그렇게 임의로 몇번 딸깍딸깍하면 원본이었던 정보가 훼손되기 때문이라는 이유였다.
해결법은 GridView가 아니라 GridControl에 넣는 것이다.
여기서 첫번째 줄의 설명으로는 Grid Control은 여러 종류의 View에 표시하기 위한 data-aware control이라고 한다.
('귀에 걸면 귀걸이 코에 걸면 코걸이' 정도로 이해했다.)
좀 더 상위의 개념이므로 GridView에서 데이터가 바뀌더라도 GridControl의 DataSource에는 영향이 없다고 한다.
반대로 뷰에서 순서를 바꾸거나 데이터를 변경했고 그대로 적용하고 싶다면 GridView DataSource를 받아서 처리하는 것도 방법이라고 생각한다.