请问:cxdbtreelist,怎么让节点根据值的不同再改变记录的颜色?我在 cxDBTreeList1的CustomDrawCell事件里写如下代码:procedure TForm1.cxDBTreeList1CustomDrawCell(Sender: TObject;
  ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo;
  var ADone: Boolean);
begin  if ADOQuery1.FieldByName('DepCode').AsString='0001' then
     Acanvas.SetBrushColor(clRed)
end; 
刚运行的时候,没有反应,但当鼠标点击到该变颜色的那条记录时,要么就是两条记录的颜色变了,要么就是所有的记录就都变颜色了.
请问该咋弄呢??????????????

解决方案 »

  1.   

    参考如下:procedure TFrmMain.DBGridEquipmentDrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);  
    begin
      if gdSelected in State then Exit;  //隔行改变网格背景色:
      if FrmDm.ADMachine.FieldByName('Status').AsInteger = MACHINE_STATE_DRAFT then
        (Sender as TDBGrid).Canvas.Brush.Color := clInfoBk//RGB(255, 201, 147) //定义背景颜色
      else if FrmDm.ADMachine.FieldByName('Status').AsInteger = MACHINE_STATE_AUDITING then
        (Sender as TDBGrid).Canvas.Brush.Color := RGB(151, 203, 255) //定义背景颜色
      else if FrmDm.ADMachine.FieldByName('Status').AsInteger = MACHINE_STATE_AUDITED then
        (Sender as TDBGrid).Canvas.Brush.Color := RGB(165, 220, 220) //定义背景颜色
      else if FrmDm.ADMachine.FieldByName('Status').AsInteger = MACHINE_STATE_STANDBY then
        (Sender as TDBGrid).Canvas.Brush.Color := RGB(154, 154, 78) //定义背景颜色
      else if (FrmDm.ADMachine.FieldByName('Status').AsInteger = MACHINE_STATE_ENCAPSULATED)
         or (FrmDm.ADMachine.FieldByName('Status').AsInteger = MACHINE_STATE_ABANDONED) then
        (Sender as TDBGrid).Canvas.Brush.Color := clMedGray; //定义背景颜色
      

  2.   


    procedure TForm1.cxDBTreeList1CustomDrawCell(Sender: TObject;
      ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo;
      var ADone: Boolean);
    var
      vColor : TColor;
    begin
      vColor := aCanvas.Brush.Color;//先记录原先的颜色
      if ADOQuery1.FieldByName('DepCode').AsString='0001' then
         Acanvas.SetBrushColor(clRed)
      else
        Acanvas.SetBrushColor(vColor); 
    end; 
      

  3.   

    根據你前面的描述,應該是你的cxgrid與dataset的關系設定上的問題。比如cxgrid在剛開始沒有任何反應,就像dataset執行了disablecontrol一樣。我記得cxgrid的gridmode若設定為true會造成這種情況。
      

  4.   


    不能用ADOQuery1的值判断,要用AViewInfo中的属性去判断,当然你grid中要增加'DepCode'列,然后在AViewInfo中访问这个列的值,具体是AViewInfo的哪个属性,我帮你找找
      

  5.   

    首先增加一列,字段为'DepCode',列名为cxCodeprocedure TForm1.cxDBTreeList1CustomDrawCell(Sender: TObject; 
      ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo; 
      var ADone: Boolean); 
    begin   if AViewInfo.Node.Texts[cxCode.ItemIndex]='0001' then 
        Acanvas.SetBrushColor(clRed) 
    end; … 
      

  6.   

    to bdmh, “不能用ADOQuery1的值判断”,應該是沒有這樣的限制吧?他的程序剛開始在 數據集 scroll滾動時,并無反應。
      

  7.   

    谢谢bdmh,按照你的方法搞定了......结贴.....