자작소스/C++/MFC/API

DB에서 그룹을 읽어 CTreeView 로 뿌리기

와이즈번 2008. 12. 20. 01:30



액세스로 간단히 구성해 봤는데 테이블은 이미지와 같다.
id 는 PK 이고 div_id 는 부모의 id 값이고 is_last_node 는 말단 노드인지 표시하는 필드다.

소스코드는 아래와 같다.



 CTreeView::OnInitialUpdate();
 
//이미지 리스트 생성
 CImageList il;
 il.Create(IDB_BITMAP1, 16, 1, RGB(255, 255, 255));

 //이미지 리스트 설정
 CTreeCtrl& tree = GetTreeCtrl();
 tree.SetImageList(&il, TVSIL_NORMAL);
 il.Detach();
 //1레벨 초기화
 HTREEITEM hGrp = tree.InsertItem("대학교", 0, 0, TVI_ROOT, TVI_LAST);

 CString csId;
 csId.LoadString(IDS_DB_DSN);
 CDatabase db;
 db.OpenEx(csId,0);
 CRecordset rs(&db);
 rs.Open(CRecordset::dynaset, "SELECT COUNT(*) FROM tbl_group");
 rs.GetFieldValue(short(0),csId);
 rs.Close();
 if(csId.Compare("0") != 0) {
  int cnt,cnt1;
  cnt = _ttoi(csId);
  HTREEITEM* hGrp1 = new HTREEITEM[cnt];
  rs.Open(CRecordset::dynaset, "SELECT * FROM tbl_group ORDER BY div_id ASC");
 
  CString csName,csDivId,csNextDivId;
  while(!rs.IsEOF()) {
   rs.GetFieldValue(short(0),csId);
   rs.GetFieldValue(short(1),csName);
   rs.GetFieldValue(short(2),csDivId);
   rs.GetFieldValue(short(3),csNextDivId);

   
   cnt = _ttoi(csDivId);
   cnt1 = _ttoi(csId);

   if(csDivId.Compare("0") == 0 && csNextDivId.Compare("0") == 0)
    hGrp1[--cnt1] = tree.InsertItem(csName, 1, 1, hGrp, TVI_LAST);
   else if(csDivId.Compare("0") == 0 && csNextDivId.Compare("0") != 0)
    hGrp1[--cnt1] = tree.InsertItem(csName, 2, 2, hGrp, TVI_LAST);
   else if(csNextDivId.Compare("0") == 0)
    hGrp1[--cnt1] = tree.InsertItem(csName, 1, 1, hGrp1[--cnt], TVI_LAST);
   else
    hGrp1[--cnt1] = tree.InsertItem(csName, 2, 2, hGrp1[--cnt], TVI_LAST);

   rs.MoveNext();
  }

  rs.Close();
  delete [] hGrp1;
 }
 db.Close();


출력화면