Q&A

  • DB그리드에서
DB그리드를 이용해서 특정 테이블을 쿼리해 왔습니다.

50개의 레코드를 쿼리 해왔는데

1> 그 레코드중 선택한 레코드가 몇번째 레코드인지...

2> 짝수 와 홀수 레코드마다 색깔을 다르게할수 있는지...

3> 짝수와 홀수 필드마다 색깔을 다르게할 수 있는지...

4> 특정 셀의 값을 변경할 수 있는지...

5> 특정 셀의 값을 특정 EDIT에 넣을수 있는지...

초절정 고수님들 부탁합니다.
1  COMMENTS
  • Profile
    오익환 2003.10.01 06:25


    예전에 억지로 만들었던 겁니다.

    DrawDataCell을 이용하라는 내용의 자료가 많았지만 잘 안되더군요
    DrawColumnCell을 이용했고 Scroll시 Color가 잘 적용되지 않아
    Timer로 무식하게 처리 했습니다. 참고만 하시고

    DbGrid1.DataSource.DataSet.RecNo
    Column.Field.AsString (or Value)
    DbGrid1.SelectedIndex 을 쓰면 RecNo와 Select된 Data를 Reference
    할 수 있을겁니다.

    도움이 될런지........


    //====================================================================
    procedure TFmCtrlGrid.DBGrid1DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    //--------------------------------------------------------------------
    var lROW,i : integer;
    var lRECT  : TRect;
        lBrushColor: TColor;

    begin
      With TStringGrid(Sender) do
        begin
          for i:=0 to RowCount-1 do
            begin
              lRECT:=CellRect(0,i);
              if (Rect.Top>=lRECT.TOP) and (Rect.Top<=lRECT.BOTTOM) then
                begin
                  lROW:=i;
                  BREAK;
              end;
          end;
      end;
      lBrushColor:=TDbGrid(Sender).Canvas.Brush.Color;
      if gdSelected in State then EXIT;

      if (lROW mod 2)=0 then
        begin
          if (DataCol mod 2)=0 then TDbGrid(Sender).Canvas.Brush.Color:=clGreen
          else TDbGrid(Sender).Canvas.Brush.Color:=clBlue;
        end
      else
        begin
          TDbGrid(Sender).Canvas.Brush.Color:=TDbGrid(Sender).Color;
      end;

      DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
      TDbGrid(Sender).Canvas.Brush.Color:=lBrushColor;
    end;
    //====================================================================
    procedure TFmCtrlGrid.DBGrid1CellClick(Column: TColumn);
    begin
      //ShowMessage(Column.Field.AsString);
      ShowMessage(IntTostr(DbGrid1.SelectedIndex));
    end;
    //====================================================================
    procedure TFmCtrlGrid.Timer1Timer(Sender: TObject);
    begin
      // DbGrid Scroll 시 Refresh가 안되어서 무식하게 처리 Timer1.Tag 도용
      if Timer1.Tag<>DbGrid1.DataSource.DataSet.RecNo then
        begin
          DbGrid1.Refresh;
          Timer1.Tag:=DbGrid1.DataSource.DataSet.RecNo;
      end;
    end;
    //====================================================================