如何将颜色仅应用于TcxTreelists的子节点



关于devexpress树列表的另一个问题。我已经设法获得了一个cxgrid来根据存储在网格中的值对行进行着色。我试图将这些知识转移到树列表中,但进展并不顺利。我目前将整个网格着色,并将子节点保留为默认值(白色背景上的黑色文本)。

我认为问题在于何时以及如何填充子节点。当前,它们是动态填充的,并在选择更改时删除。

var
LNode : TcxTreeListNode;
LListData : TOfferList;
LSiteData : TSiteList;
LContract : TItem;
begin
  LNode := TreeTypes.FocusedNode;
  if Assigned(LNode) then
  begin
    if LNode.Level = 0 then
    begin
      LNode.DeleteChildren; //clear children so that list doesnt get duplicate entries / children
      LSiteData := TSiteList(LNode.Data); //root node info
      PopulateOfferList; //populate children list with data from DB
      InitialiseOffers; // populate treelist with children gathered from the list above
      LNode.Expand(True);
   end
   else
   begin
     LListData := TOfferList(LNode.Data); //do stuff with selected child node
     LContract := TItem.Create(LListData.UnitID);//do stuff with selected child node
    end;
  end;
end;

照目前情况来看,效果不错。我可以用所有的信息做我需要做的事情。然而,整个列表都是黑白的。为了帮助识别子节点中的任何差异,我希望根据填充过程中收集的信息(DB对象)对它们进行着色。

当前自定义绘图:

procedure TFrmTestView1.TreeTypesCustomDrawDataCell(Sender: TcxCustomTreeList;
ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo;
var ADone: Boolean);
var
  LState : TStates;
  LOffer : TOfferList;
begin
  if (Assigned(AViewInfo)) and (Assigned(AViewInfo.Node)) then
  begin
    if AViewInfo.Node.Level > 0 then
    begin
      LOffer := AViewInfo.Node.Data;
      LState := FGlobals.GetStateFromID(LOffer.StateID);
    end;
  end;
   if AViewInfo.Node.Level > 0 then
   begin
     if Assigned(LState) then
     begin
       ACanvas.Brush.Color := LState.Background;
       ACanvas.Font.Color := LState.Foreground;
     end;
   end;

这会导致在更改父(根)节点时发生访问冲突,并且不会给任何子节点着色。我尝试在nodeselectionchange事件上添加Tree.FullRefresh,但似乎没有任何效果。

我只想能够根据存储在节点中的数据更改背景和文本颜色。父节点显示为黑色和白色,子节点显示为整个颜色阵列。

谢谢你,

我非常乐意补充我错过的任何问题或提示。注意:我使用Node.AddChild过程添加子节点。

编辑:我想我已经添加了方法签名,从来没有听说过它是这样叫的,所以这是我可以在列表中打勾的一个术语。

Devexpress帐号终于建立起来了!

答案来自他们,但我想如果有人找的话,我会把它贴在这里。原来我是个白痴

var
  LState : TStates;
  LOffer : TOfferList; 
begin
  if AViewInfo.Node.Level > 0 then
  begin
    LOffer := TOfferList(AViewInfo.Node.Data);
    LState := FGlobals.GetStateFromTag(LOffer.StateTag);
    ACanvas.Brush.Color := LState.Background; //integer stored in db
    ACanvas.Font.Color := LState.Foreground; //integer stored in db
  end;
end;

事实证明,我试图通过将过程拆分为"收集数据"然后应用画布来过度复杂化它。通过将其保持在一起,它就起作用了。请注意,未来的我KISS(保持简单愚蠢)!。

抱歉耽误了你们的时间。感觉我试图让这个问题变得比更难

相关内容

  • 没有找到相关文章

最新更新