오늘은 jqGrid에서 SubGrid 설정하면서 배웠던 내용들을 정리해본다.
처음에는 단순히 옵션만 설정하면 되는 줄 알았는데, 실제로 해보니 신경 쓸 게 은근 많았다.
1. 기본 설정
먼저 SubGrid를 활성화하고 기본적인 모양을 잡아주는 설정:
$("#mainGrid").jqGrid({
// ... 다른 설정들 ...
subGrid: true, // SubGrid 사용
subGridOptions: {
plusicon: "ui-icon-triangle-1-e", // 접힌 상태
minusicon: "ui-icon-triangle-1-s", // 펼쳐진 상태
openicon: "ui-icon-arrowreturn-1-e", // 화살표
expandOnLoad: false, // 처음부터 다 펼치지 않음
selectOnExpand: true, // 펼칠 때 행 선택되게
reloadOnExpand: false // 매번 새로 로드하지 않음
}
});
이렇게만 하면 아이콘은 생기는데... 실제로 뭔가를 보여주진 않는다.
2. SubGrid 이벤트 핸들링
SubGrid가 펼쳐질 때 실제 내용을 그려줘야 한다. 크게 두 단계로 나눠서 처리했다:
// 1. 펼치기 전에 체크
subGridBeforeExpand: function(subgrid_id, row_id) {
if(row_id == 'blankRow') return false; // 빈 행
var rowdata = $(this).getRowData(row_id);
if(!rowdata.hasChild) { // 자식 데이터가 없으면
alert("상세 내역이 없습니다.");
return false;
}
return true;
},
// 2. 실제로 펼칠 때
subGridRowExpanded: function(subgrid_id, row_id) {
var rowdata = $(this).getRowData(row_id);
createDetailGrid(rowdata, subgrid_id);
}
3. 실제 하위 그리드 생성하기
여기서 삽질을 좀 했다.
처음엔 단순히 div에 데이터만 넣으면 되는 줄 알았는데, 하위 그리드도 완전한 jqGrid를 새로 만들어줘야 했다:
function createDetailGrid(masterData, subgrid_id) {
// 1. 고유한 ID 생성
var subgrid_table_id = subgrid_id + "_t";
var pager_id = "p_" + subgrid_table_id;
// 2. 그리드 마크업 생성
$("#" + subgrid_id).html(
"<table id='" + subgrid_table_id + "'></table>" +
"<div id='" + pager_id + "'></div>"
);
// 3. 하위 그리드 초기화
$("#" + subgrid_table_id).jqGrid({
url: 'api/details',
postData: {
parentId: masterData.id // 부모 데이터 ID
},
colModel: [
{name: 'detailCode', label: '상세코드'},
{name: 'detailName', label: '상세명'},
// ... 더 많은 컬럼들
],
width: '100%',
height: '100%'
// ... 더 많은 옵션들
});
}
✅ 메모
- expandOnLoad는 웬만하면 false로
- true로 하면 처음 로딩할 때 모든 하위 데이터를 다 가져오려고 함
- 데이터가 많으면 초기 로딩이 너무 오래 걸림
- reloadOnExpand도 false가 좋다
- true면 접었다 펼칠 때마다 매번 서버 호출
- 단, 실시간성이 중요한 데이터라면 true도 고려
- 하위 그리드 width 설정 주의
- 부모 그리드보다 살짝 작게 설정하는게 좋음
- 스크롤이 생길 수 있어서
- 에러 처리도 꼭 해주자
loadError: function(xhr, status, error) {
alert("상세 데이터 조회 중 오류가 발생했습니다.");
return false;
}
다음에는 커스텀 포매터로 셀 데이터 꾸미기에 대해 정리해봐야겠다.
'개발노트 > jqGrid' 카테고리의 다른 글
[jqGrid] jqGrid + MyBatis로 오름차/내림차 동적 정렬 구현하기 (1) | 2025.01.20 |
---|---|
[jqGrid] MyBatis 페이징 처리 (1) | 2025.01.15 |
[jqGrid] 이벤트 핸들링 - ready, loadComplete, onSelectRow, change (3) | 2025.01.02 |
[jqGrid] 그리드 데이터 다루기 - 값 가져오기/수정하기 (3) | 2025.01.01 |
[jqGrid] 기본 그리드 만들기 (1) | 2024.12.30 |