|
송영규 님이 쓰신 글 :
: DBGrid에서 컬럼전체 혹은 행 전체의 색깔을 바꾸는 것은 그리 어려운 일은 아닙니다.
: 그런데 원하는 행에서 특정 열의 색깔을 바꾸고 싶은데 어떻게 해야 합니까!!
: 아시는분 해법을 좀 올려주세요
안녕하세요 정진후라고 합니다.
간단한 방법은 디비그리드의 DrawColumnCell이벤트 핸들러를 기술하면 됩니다.
주의 하실 점으로는 TQuery나 TTable에 의해 셀렉된 레코드를 디비그리드에 하나
하나 다시 "수동"으로 그려 주시는 만큼 다양한 경우(해당 셀이 선택되어 있을
경우는 색을 어떻게 해야 할지, 폰트의 색은 어떻게 할지)를 "직접"
코딩해 주셔야 합니다. 그리고 셀렉된 모든 필드를 디비그리드 상에 표시할 때마다
발생하는 이벤트이므로 원하시는 컬럼 이외의 필드들은 처리하지 않으셔야 합니다.
즉, 원하시는 컬럼은 DrawColumnCell을 이용해서 직접 그리시고,
나머지 컬럼들은 디비그리드가 디폴트로 그리는 대로 놔둔다고 생각하시면
되겠습니다.
void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,//이 인자로 해당 컬럼을 판별합니다.
TGridDrawState State) //TColumn의 헬프를 보시면 유용한 정보가
{
try {
if(Column->FieldName != "EMP_NAME")//"EMP_NAME"이외의 컬럼은 디폴트로 그리라는 의미.
return; //원하시는 컬럼의 이름을 기술하시면 됩니다.
Variant vFieldVal = Column->Field->Value;
if (State.Contains(Grids::gdSelected)) {//선택된 행
DBGrid1->Canvas->Brush->Color = clNavy;
DBGrid1->Canvas->FillRect(Rect);
DBGrid1->Canvas->Font->Color = clWhite;
}
else { //선택되지 않은 행
DBGrid1->Canvas->Brush->Color = 원하는 컬러;
DBGrid1->Canvas->FillRect(Rect);
DBGrid1->Canvas->Font->Color = clBlack;
}
DBGrid1->Canvas->TextOut(Rect.Left + 2, Rect.Top + 2, vFieldVal);
}
catch (...) {
return;
}
}
//---------------------------------------------------------------------------
정도로 하시면 원하시는 바를 얻을 수 있으실 것 같은데...
디버깅을 한 것은 아니어서 버그가 있을 수도 있고요. 만일 그렇다면
다시 글을 올려주시던가 메일 보내 주세요.
그럼 이만.
|