|
임펠리테리입니다.
일반적으로는, 디비그리드에 데이터셋을 데이터소스를 통해 연결할 때 디비그리드의 컬럼을 세팅하지 않죠.
연결된 데이터셋이 오픈되지 않았을 때 디비그리드에 썰렁하게 셀 하나만 나타나면 컬럼이 세팅되지 않은
상태입니다. 데이터셋이 오픈되면 데이터셋의 컬럼들이 나타나죠.
그런데, 디비그리드의 컬럼들을 지정해두면 오픈되지 않은 상태에서도 디비그리드에 컬럼들이 항상 나타날 뿐 아니라, 나타날 컬럼들을 선택할 수도 있습니다. 이렇게 하려면, 간단히 오브젝트 인스펙터에서
디비그리드의 Columns 프로퍼티를 더블클릭하면 나타나는 컬럼 에디터를 이용하면 됩니다.
일단 데이터셋을 오픈시켜놓은 상태에서 이 컬럼에디터 윈도우에서 세번째 툴버튼(격자모양에 빨강 파랑 노랑이
그려진 버튼)을 누르면 데이터셋의 모든 필드들을 디비그리드의 컬럼으로 가져오게 됩니다. 이렇게 해놓으면
데이터셋이 오픈되지 않은 상태에서도 컬럼들이 모두 나타나구요.
중요한 것은, 이 상태에서 컬럼 에디터의 첫번째 툴버튼을 누르면 새로운 컬럼을 추가할 수 있다는 것입니다.
새로 추가한 컬럼은 오브젝트인스펙터에서 FieldName을 선택하면 데이터셋의 필드를 나타내는 컬럼이 됩니다만,
여기다가 일련번호를 쓰는 것이 목적이므로 그냥 비워놓습니다. 그리고 이 컬럼에는 제목이 없으므로,
컬럼의 Title - Caption에 컬럼 이름을 적어넣습니다.
일련번호니까 가장 앞으로 옮겨놓읍시다. 컬럼에디터에서 아이템을 드래그하면 가장 위로 옮겨놓을 수 있습니다.
이렇게 해서, 디비그리드에 새로운 컬럼이 추가되었습니다. 그런데 여기다가 값을 쓸 방법이 없지요.
그래서, 디비그리드의 오너드로우 특성을 이용하여 일련번호를 직접 그려줘야 합니다.
디비그리드의 OnDrawColumnCell 이벤트 핸들러를 만들고 다음과 같이 코딩합니다.
void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
{
if(DBGrid1->DataSource->DataSet->Active && DataCol == 0)
DBGrid1->Canvas->TextOut(Rect.Left + 2, Rect.Top + 2, DBGrid1->DataSource->DataSet->RecNo);
}
이렇게 하면 원했던 기능을 볼 수 있습니다.
한 가지.. 이 추가된 새 컬럼이 에디트 모드로 들어가는 것을 막을 수 있는 대책이 없습니다. ^^;;
필요하시다면 이건 스스로 구현해보시지요.
그럼 이만...
윤주일 님이 쓰신 글 :
: 안녕하세요..
:
: DB에서 읽어온 레코드를 DBGrid에 표시하는데요..
:
: 한 컬럼은 DB의 내용과 상관없이 일련번호를 줄려구 하는데 어떻게 해야 할까요?
:
: DBGrid의 레코드가 삭제되어도 빠지는 번호 없이 그대로 유지되게요..
:
: 답변 부탁드립니다.
:
:
|